Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
#1

Можно ли сравнивать потоки? - C++

02.03.2012, 05:39. Просмотров 2184. Ответов 41
Метки нет (Все метки)

А точнее, проверять их на равенство? Скажем, допустимо ли в перегруженном операторе ввода использовать конструкцию if (stream == cout), и будет ли она корректно работать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2012, 05:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли сравнивать потоки? (C++):

Можно ли сравнивать строковые литералы? как правильно это сделать? - C++
надо сравнить введенный строковый литерал с одним из доступных. int main() { setlocale(0,""); char const s =15; char...

О потоках std::thread: можно ли вложить потоки друг в друга и можно ли создать динамический массив потоков? - C++
1) Могу ли я вложить потоки друг в друга? 2) Могу ли я создать динамический массив потоков, каким-либо образом инициализировав их потом в...

Как можно сравнивать в структуре числа и выводить на экран по возрастанию, если структура находится в файле? - C++
Как можно сравнивать в структуре числа и выводить на экран по возрастанию, если структура находится в файле?

Что такое потоки ввода, потоки вывода? - C++
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

как сравнивать даты? - C++
Имеется текстовый файл, в нем список учебных дней когда есть математика, в формате "дд/мм/гг,дд/мм/гг,дд/мм/гг," и т.д. и даты начала и...

Как сравнивать структуры - C++
Есть структура например struct TIME { int min; int sec; }; TIME A={10,15},B; B=A; //можно...

41
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.03.2012, 07:34 #2
Нельзя. И да, уточни, что ты подразумеваешь под равенством потоков?
0
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 10:37  [ТС] #3
Когда в функцию в качестве аргумента передаётся какой-либо поток, можно ли внутри неё явно проверить (и предусмотреть на этот случай действия) не является ли этот поток, скажем, потоком cout?

И да, уточни, что ты подразумеваешь под равенством потоков?
Когда поток, известный в функции, является в тоже время потоком, известным под другим именем (скажем, каким-либо из стандартных).
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,404
02.03.2012, 10:41 #4
А зачем???
0
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 10:54  [ТС] #5
Я другого варианта пока не придумал. По сути - есть квадратная матрица. Нужно перегрузить операторы ввода/вывода. При выводе на консоль выводятся символы ||, в качестве обозначения матрицы. При выводе в файл эти символы выводить не нужно. Плюс, при вводе с консоли ввод осуществляется по одному элементу, с выводом приглашений. При вводе из файла это явно неуместно. Единственный вариант, который я придумал, чтобы проблемы эти решить - предусмотреть различный набор действий для потоков. Впрочем, если другой вариант, более простой, предложите, буду только рад.
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
02.03.2012, 10:58 #6
Kravensky, Не понятно в чем именно проблема.....не ясно причем здесь потоки....
А посылать в cout и на вывод в файл разные данные не получается что ли?
0
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 11:03  [ТС] #7
А посылать в cout и на вывод в файл разные данные не получается что ли?
Как это сделать, если сама функция не распознаёт, какой именно поток ей был передан?
0
solar_wind
757 / 748 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
02.03.2012, 11:05 #8
Kravensky, Какая функция?, напиши конкретно, выложи код или часть кода.
Из того что ты писал я только понял что есть квадратная матрица в твоей программе....не понятно почему ты не можешь контролировать выходные то данные, которые поидее ты же посылаешь в консоль или в файл.....?
0
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 11:11  [ТС] #9
Текущая версия функции вывода (с учётом предположения, что потоки можно проверять на равенство)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* Вывод квадратной матрицы */
ostream &operator<< (ostream &stream, square_matrix output_matrix)
{
    if (stream == cout)
    {
        for (int i = 0; i <= output_matrix.order - 1; i++)
        {
            stream << right << resetiosflags (ios::left) << setw (3) << "||";
            
            for (int j = 0; j <= output_matrix.order - 1; j++)
                stream << right << resetiosflags (ios::left) << setw (3) << output_matrix.coefficents_set [i] [j];
    
            stream << right << resetiosflags (ios::left) << setw (3) << "||" << endl;
        }
 
        stream << endl;
    }
    else
    {
        stream << output_matrix.order << endl;
        
        for (int i = 0; i <= output_matrix.order - 1; i++)
            for (int j = 0; j <= output_matrix.order - 1; j++)
                stream << right << resetiosflags (ios::left) << setw (3) << output_matrix.coefficents_set [i] [j];
 
        stream << endl;
    }
    
    return stream;
}
Текущая версия функции ввода (с учётом предположения, что потоки можно проверять на равенство)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* Ввод квадратной матрицы */
istream &operator>> (istream &stream, square_matrix &input_matrix)
{
    if (stream == cin)
    {
        for (int i = 0; i <= input_matrix.order - 1; i++)
            for (int j = 0; j <= input_matrix.order - 1; j++)
            {
                cout << "Введите элемент [" << i + 1 << "] [" << j + 1 << "]: ";
                stream >> input_matrix.coefficents_set [i] [j];
            }
    }
    else
    {
        int x;
        
        stream >> x;
        
        if (x == input_matrix.order)        
            for (int i = 0; i <= input_matrix.order - 1; i++)
                for (int j = 0; j <= input_matrix.order - 1; j++)
                    stream >> input_matrix.coefficents_set [i] [j];
        else
        {
            cout << "Матрицу из этого потока записать не удалось." << endl;
            cout << "Не совпадают порядки" << endl;
        }
    }
    
    return stream;
}
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,404
02.03.2012, 11:12 #10
Kravensky, рассмотри шаблонную функцию вывода в поток.
И напиши специализацию этой функции конкретно для потока std::cout, которая будет выполнять именно "дополнительный" вывод красивых рамочек и т.п. Во всем остальном компилятор с успехом разберется сам.
0
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 11:29  [ТС] #11
Kravensky, рассмотри шаблонную функцию вывода в поток.
В смысле рассмотреть? Написать? Обобщив тип потока?
И напиши специализацию этой функции конкретно для потока std::cout, которая будет выполнять именно "дополнительный" вывод красивых рамочек и т.п.
Как? Вроде по типам только специализировать можно. И, вроде, std::cout тип ostream имеет. Который в параметрах функций одинаково годен и для файловых потоков.
0
zss
Модератор
Эксперт С++
6570 / 6132 / 2021
Регистрация: 18.12.2011
Сообщений: 15,984
Завершенные тесты: 1
02.03.2012, 11:32 #12
Для потоков оператор == перегружен.
Так что никто не запрещает их сравнивать.
И, думаю, так делают многие.
0
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.03.2012, 11:35 #13
Kravensky, ИМХО, класс матрицы не должна знать, как выводить себя на печать, ведь вид и представление напечатанной матрицы целиком и полностью зависит от пользователя. Вдруг, к примеру, ты захочешь выводить матрицу в табличный виджет GUI-шного приложения, зачем тебе тогда понадобятся твои операторы вывода в поток?
Определи функции или классы, которые будут управлять вводом-выводом матрицы, и будет тебе счастье.
0
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 11:40  [ТС] #14
Для потоков оператор == перегружен.
Так что никто не запрещает их сравнивать.
И, думаю, так делают многие.
Всё, теперь я точно запутался. Так мой вариант функции работать будет или нет?
Определи функции или классы, которые будут управлять вводом-выводом матрицы, и будет тебе счастье.
Что я и пытаюсь сделать.
Вдруг, к примеру, ты захочешь выводить матрицу в табличный виджет GUI-шного приложения, зачем тебе тогда понадобятся твои операторы вывода в поток?
В данный момент мне нужно выводить в поток. И вряд ли GUI-шные приложения и табличные виджеты мне скоро понадобятся.
0
Luke
39 / 39 / 1
Регистрация: 21.02.2012
Сообщений: 95
02.03.2012, 11:58 #15
запись

C++
1
if(cin==cout)
равна
C++
1
if(cin.operator void *()==cout.operator void *())
здесь проверяется состояние потока и если он впоряде возвращается указатель this приведенный к void*
т.е. фактически сравниваются 2 указателя this.

Поскольку cin и cout это объекты класса созданные глобально, то у них указатель this отличается.Отличаться он будет и от потоков созданных тобой. Будут сравниваться их указатели this приведенные к void*

сравнивай наздоровье.

p/s если еще шире то система при создании потока помещает его в определенную область памяти и присваивает уникальный описатель потока. в любом случае сравнение возможно
0
02.03.2012, 11:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2012, 11:58
Привет! Вот еще темы с ответами:

Как сравнивать char '\'? - C++
Компиляция следуещего кода приводит к ошибке: if(field == field &amp;&amp; field == '\') turnOn = true; после слэша ожидается значение...

Функция strcmp() отказывается сравнивать - C++
Доброго всем здравия, я взял небольшой фрагмент из программы. Поясните пожалуйста почему он не работает? #include &quot;stdafx.h&quot; #include...

КАК СРАВНИВАТЬ ДВУМЕРНЫЙ МАССИВ?? - C++
Нужно решить задачу и найти наибольший элемент. Подскажите, как сделать? НУЖНО РЕШИТЬ ЗАДАЧУ И НАЙТИ НАИБОЛЬШИЙ ЭЛЕМЕНТ!!! ПОДСКАЖИТЕ...

Как сравнивать regex выражения? - C++
std::vector &lt;std::regex&gt; lex; lex.push_back(std::regex(&quot;^()*&quot;)); lex.push_back(std::regex(&quot;^()*&quot;)); Вот как сравнить два...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.