Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
Kravensky
 Аватар для Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 05:39     Можно ли сравнивать потоки? #1
А точнее, проверять их на равенство? Скажем, допустимо ли в перегруженном операторе ввода использовать конструкцию if (stream == cout), и будет ли она корректно работать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
02.03.2012, 07:34     Можно ли сравнивать потоки? #2
Нельзя. И да, уточни, что ты подразумеваешь под равенством потоков?
Kravensky
 Аватар для Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 10:37  [ТС]     Можно ли сравнивать потоки? #3
Когда в функцию в качестве аргумента передаётся какой-либо поток, можно ли внутри неё явно проверить (и предусмотреть на этот случай действия) не является ли этот поток, скажем, потоком cout?

И да, уточни, что ты подразумеваешь под равенством потоков?
Когда поток, известный в функции, является в тоже время потоком, известным под другим именем (скажем, каким-либо из стандартных).
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
02.03.2012, 10:41     Можно ли сравнивать потоки? #4
А зачем???
Kravensky
 Аватар для Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 10:54  [ТС]     Можно ли сравнивать потоки? #5
Я другого варианта пока не придумал. По сути - есть квадратная матрица. Нужно перегрузить операторы ввода/вывода. При выводе на консоль выводятся символы ||, в качестве обозначения матрицы. При выводе в файл эти символы выводить не нужно. Плюс, при вводе с консоли ввод осуществляется по одному элементу, с выводом приглашений. При вводе из файла это явно неуместно. Единственный вариант, который я придумал, чтобы проблемы эти решить - предусмотреть различный набор действий для потоков. Впрочем, если другой вариант, более простой, предложите, буду только рад.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
02.03.2012, 10:58     Можно ли сравнивать потоки? #6
Kravensky, Не понятно в чем именно проблема.....не ясно причем здесь потоки....
А посылать в cout и на вывод в файл разные данные не получается что ли?
Kravensky
 Аватар для Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 11:03  [ТС]     Можно ли сравнивать потоки? #7
А посылать в cout и на вывод в файл разные данные не получается что ли?
Как это сделать, если сама функция не распознаёт, какой именно поток ей был передан?
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
02.03.2012, 11:05     Можно ли сравнивать потоки? #8
Kravensky, Какая функция?, напиши конкретно, выложи код или часть кода.
Из того что ты писал я только понял что есть квадратная матрица в твоей программе....не понятно почему ты не можешь контролировать выходные то данные, которые поидее ты же посылаешь в консоль или в файл.....?
Kravensky
 Аватар для 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;
}
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
02.03.2012, 11:12     Можно ли сравнивать потоки? #10
Kravensky, рассмотри шаблонную функцию вывода в поток.
И напиши специализацию этой функции конкретно для потока std::cout, которая будет выполнять именно "дополнительный" вывод красивых рамочек и т.п. Во всем остальном компилятор с успехом разберется сам.
Kravensky
 Аватар для Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 11:29  [ТС]     Можно ли сравнивать потоки? #11
Kravensky, рассмотри шаблонную функцию вывода в поток.
В смысле рассмотреть? Написать? Обобщив тип потока?
И напиши специализацию этой функции конкретно для потока std::cout, которая будет выполнять именно "дополнительный" вывод красивых рамочек и т.п.
Как? Вроде по типам только специализировать можно. И, вроде, std::cout тип ostream имеет. Который в параметрах функций одинаково годен и для файловых потоков.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
02.03.2012, 11:32     Можно ли сравнивать потоки? #12
Для потоков оператор == перегружен.
Так что никто не запрещает их сравнивать.
И, думаю, так делают многие.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
02.03.2012, 11:35     Можно ли сравнивать потоки? #13
Kravensky, ИМХО, класс матрицы не должна знать, как выводить себя на печать, ведь вид и представление напечатанной матрицы целиком и полностью зависит от пользователя. Вдруг, к примеру, ты захочешь выводить матрицу в табличный виджет GUI-шного приложения, зачем тебе тогда понадобятся твои операторы вывода в поток?
Определи функции или классы, которые будут управлять вводом-выводом матрицы, и будет тебе счастье.
Kravensky
 Аватар для Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 11:40  [ТС]     Можно ли сравнивать потоки? #14
Для потоков оператор == перегружен.
Так что никто не запрещает их сравнивать.
И, думаю, так делают многие.
Всё, теперь я точно запутался. Так мой вариант функции работать будет или нет?
Определи функции или классы, которые будут управлять вводом-выводом матрицы, и будет тебе счастье.
Что я и пытаюсь сделать.
Вдруг, к примеру, ты захочешь выводить матрицу в табличный виджет GUI-шного приложения, зачем тебе тогда понадобятся твои операторы вывода в поток?
В данный момент мне нужно выводить в поток. И вряд ли GUI-шные приложения и табличные виджеты мне скоро понадобятся.
Luke
37 / 37 / 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 если еще шире то система при создании потока помещает его в определенную область памяти и присваивает уникальный описатель потока. в любом случае сравнение возможно
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,573
Записей в блоге: 17
02.03.2012, 12:54     Можно ли сравнивать потоки? #16
А нельзя перегружать с ostream если консоль и ofstream при выводе в файл ?
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
02.03.2012, 13:08     Можно ли сравнивать потоки? #17
Avazart, если правильно тебя понял то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void compare (basic_ostream<char>& os)
{
    
    if(os==cout)
    {
        os<<"COUT";//выведет в консоль
    }
    else
    {
        os<<"FILE";//закатает в файл файлового потока, если os -fstream
    }
    
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
02.03.2012, 13:08     Можно ли сравнивать потоки? #18
Цитата Сообщение от Luke Посмотреть сообщение
здесь проверяется состояние потока и если он впоряде возвращается указатель this приведенный к void*
в новом стандарте уже не void*:
operator void*unspecified-bool-type () const ;
Returns: If fail() then a null pointer; otherwise some non-null pointer to indicate success.then a value that will
evaluate false in a boolean context; otherwise a value that will evaluate true in a boolean context. The value type
returned shall not be convertible to int.

[ Note: This conversion can be used in contexts where a bool is expected (e.g., an if condition); however, implicit
conversions (e.g., to int) that can occur with bool are not allowed, eliminating some sources of user error. One
possible implementation choice for this type is pointer-to-member. — end note ]
Цитата Сообщение от Luke Посмотреть сообщение
и если он впоряде возвращается указатель this приведенный к void*
в стандарте этого не оговорено, так что на то, что возвращается this, надеяться нельзя.
Из записи
C++
1
some_stream == another_stream
можно с уверенность сказать только одно: some_stream.fail() == another_stream.fail()

Цитата Сообщение от zss2 Посмотреть сообщение
Для потоков оператор == перегружен.
да ладно?
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
02.03.2012, 13:14     Можно ли сравнивать потоки? #19
Nameless One,


Assembler
1
2
3
4
5
004013C9    call   0x4014d0 <std::basic_ios<char, std::char_traits<char> >::operator void*() const>
004013CE    mov    %eax,%ebx
004013D0    movl   $0x6fcca2c4,(%esp)
004013D7    call   0x4014d0 <std::basic_ios<char, std::char_traits<char> >::operator void*() const>
004013DC    cmp    %eax,%ebx
это код блокс с мингв по последнему стандарту. по прежнему сравнивается адрес
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2012, 13:15     Можно ли сравнивать потоки?
Еще ссылки по теме:

Можно ли сравнивать строковые литералы? как правильно это сделать? C++
Как идти по строке с конца к середине и сравнивать буквы C++
C++ Почему два char нельзя сравнивать так ==?

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
02.03.2012, 13:15     Можно ли сравнивать потоки? #20
Luke, ну и?
Yandex
Объявления
02.03.2012, 13:15     Можно ли сравнивать потоки?
Ответ Создать тему
Опции темы

Текущее время: 14:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru