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

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

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

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

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

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

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

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

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

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

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

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

Как сравнивать ключи из слов? - C++
Сортирую ключи из слов. Не могу понять, что больше a или bc, например, подскажите,плиз, и извините за бредовость)))) Вернее вроде и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,436
Записей в блоге: 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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
это код блокс с мингв по последнему стандарту. по прежнему сравнивается адрес
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
02.03.2012, 13:15     Можно ли сравнивать потоки? #20
Luke, ну и?
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
02.03.2012, 13:20     Можно ли сравнивать потоки? #21
Nameless One, что? если один поток фэйл они точно будут не равны даже если одного типа.
если оба потока гуд - то вернется this дочернего класса который подставится в сравнение
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
02.03.2012, 13:25     Можно ли сравнивать потоки? #22
Luke, где гарантии, что у других компиляторов (или на другой платформе) или у новой версии MinGW будет точно такое же поведение?

Цитата Сообщение от Luke Посмотреть сообщение
если один поток фэйл они точно будут не равны даже если одного типа.
я тебе говорю, что «равенство» stream1 == stream2 не означает равенство потоков, оно означает, что stream1.fail() == stream2.fail()? Что тут непонятного?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
02.03.2012, 13:28     Можно ли сравнивать потоки? #23
Вот тебе пример:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <fstream>
 
#define SHOW(EXPR) std::cout << #EXPR ": " << std::boolalpha << (EXPR) << std::endl
 
int main(void)
{
    std::ifstream stream1("non_existing_file_1"), stream2("non_existing_file_2");
 
    SHOW(stream1 == stream2);
}
Запусти этот код и посмотри, чему он равен (non_existing_file_1, non_existing_file_2 — это несуществующие файлы)

Ну и еще раз цитата из стандарта:
Цитата Сообщение от Nameless One Посмотреть сообщение
One possible implementation choice for this type is pointer-to-member. — end note
обрати внимание на фразу "one possible". Эта значит, что конкретная реализация может возвращать (void*) this, другая — (void*) 100500, третья — еще что-то и т.д.
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 13:49  [ТС]     Можно ли сравнивать потоки? #24
А нельзя перегружать с ostream если консоль и ofstream при выводе в файл ?
Попробовал так. Компилятор ругается на двусмысленность. А посему вопрос: как можно явно указать поток cout?

Текущий вариант функций:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/* Вывод квадратной матрицы */
ostream &operator<< (ostream &stream, square_matrix output_matrix)
{
    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;
    
    return stream;
}
 
/* Вывод квадратной матрицы в файл */
ofstream &operator<< (ofstream &stream, square_matrix output_matrix)
{
    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;
}
 
/* Ввод квадратной матрицы */
istream &operator>> (istream &stream, square_matrix &input_matrix)
{
    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];
        }
    
    return stream;
}
 
/* Ввод квадратной матрицы из файла */
ifstream &operator>> (ifstream &stream, square_matrix &input_matrix)
{
    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;
}
Вывод компилятора:
Код
kravensky@kravensky-desktop ~ $ g++ -c -o demo.o demo_program.cpp
In file included from demo_program.cpp:3:0:
function.cpp: In function ‘std::ofstream& operator<<(std::ofstream&, square_matrix)’:
function.cpp:58:26: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
/usr/include/c++/4.5/bits/ostream.tcc:105:5: note: candidate 1: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
function.cpp:56:11: note: candidate 2: std::ofstream& operator<<(std::ofstream&, square_matrix)
Строка 58, это строка 22 в приведённом выше коде. Строка 56 - строка 20, соответственно.
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
02.03.2012, 14:01     Можно ли сравнивать потоки? #25
Цитата Сообщение от Nameless One Посмотреть сообщение
я тебе говорю, что «равенство» stream1 == stream2 не означает равенство потоков, оно означает, что stream1.fail() == stream2.fail()? Что тут непонятного?
а что ты имеешь ввиду под равенством потоков?)
речь шла о сравнении потоков, по какому признаку они сравнивались в языке - другой вопрос.
я привел пример с this, если в НОВОМ стандарте возврат this не гарантирован значит вернется некий "другой" уникальный идентификатор, по которому и пройдет сравнение.
ну а для системы они в любом случае 2 разных потока и вряд ли язык в какой либо реализации станет противоречить этому
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
02.03.2012, 14:06     Можно ли сравнивать потоки? #26
Цитата Сообщение от Luke Посмотреть сообщение
а что ты имеешь ввиду под равенством потоков?)
Можно ли сравнивать потоки?

Цитата Сообщение от Luke Посмотреть сообщение
я привел пример с this, если в НОВОМ стандарте возврат this не гарантирован значит вернется некий "другой" уникальный идентификатор, по которому и пройдет сравнение.
где это ты вычитал про «уникальность идентификатора»? Я еще раз повторю, если в некоторой реализации в булевом контексте будет всегда возвращаться (void*) 100500 вообще для всех незафейленных потоков, то это поведение уже будет соответствовать стандарту
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
02.03.2012, 14:13     Можно ли сравнивать потоки? #27
Nameless One,
Можно ли сравнивать потоки?
ответ можно.
про уникальность идентификатора потока..ну например в API твоей системы.

а тебя послушать так язык с его библиотекой будет противоречить устройству той системы на которой будет запускаться, давая идентичные идентификаторы для разных потоков и делая невозможных их различение.

проведи тест. посмотри что в регистрах при сравнениях будет
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
02.03.2012, 14:17     Можно ли сравнивать потоки? #28
Цитата Сообщение от Luke Посмотреть сообщение
а тебя послушать так язык с его библиотекой будет противоречить устройству той системы на которой будет запускаться, давая идентичные идентификаторы для разных потоков
еще раз, скажи, где ты вычитал, что "operator void*unspecified-bool-type () const;" возвращает «уникальный идентификатор»? Можешь ссылку дать, а то мне тоже интересно?

Цитата Сообщение от Luke Посмотреть сообщение
проведи тест. посмотри что в регистрах при сравнениях будет
при чем тут регистры вообще?
Luke
37 / 37 / 1
Регистрация: 21.02.2012
Сообщений: 95
02.03.2012, 14:20     Можно ли сравнивать потоки? #29
Цитата Сообщение от Luke Посмотреть сообщение
значит вернется некий "другой" уникальный идентификатор,
а все я понял. ты про это? это лишь предположение базирующееся на том что потоки они уникальны в системе, а так же на том
что в "старом" стандарте при операции сравнения дергался operator void*(), возвращавший либо 0 либо this

регистры при том, что там ты увидишь искомое значение, которое поможет тебе понять чем отличается cin от cout при их сравнении через ==
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2012, 14:20     Можно ли сравнивать потоки?
Еще ссылки по теме:

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

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

Почему я не могу сравнивать длины строк - C++
почему я не могу сравнивать длины строк?! #include &quot;stdafx.h&quot; #include&lt;string&gt; #include&lt;string.h&gt; #include &lt;iostream&gt; ...

Почему два char нельзя сравнивать так ==? - C++
Почему два char нельзя сравнивать так ==?

Как идти по строке с конца к середине и сравнивать буквы - C++
#include &lt;iostream&gt; using namespace std; int main(){ string str1; string str2; .................................//идти...


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

Или воспользуйтесь поиском по форуму:
Байт
Эксперт C
15840 / 10167 / 1522
Регистрация: 24.12.2010
Сообщений: 19,167
02.03.2012, 14:20     Можно ли сравнивать потоки? #30
Kravensky, А чего б тебе не попробовать такой код
C++
1
2
3
4
5
6
7
8
9
10
F(ofstream s)
{
  if (s==cout) cout<<"Egal";
  else            cout<<"No Egal";
}
main()
{  ofsteam ss;
  F(cout);
  F(ss);
}
И не надо никого спрашивать...
Вообще, если б это был просто Си, я бы ответил ДА.
C
1
2
 F(FILE *f)
  if ( f==stdout) ...
должно работать, тк сравниваются указатели. и еслт они указывают в одно и тоже место, то и находятся там одинаковые байты...
Yandex
Объявления
02.03.2012, 14:20     Можно ли сравнивать потоки?
Ответ Создать тему
Опции темы

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