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

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

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

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

02.03.2012, 05:39. Просмотров 2263. Ответов 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
Эксперт С++
5783 / 3432 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.03.2012, 14:29 #31
Цитата Сообщение от Luke Посмотреть сообщение
а все я понял. ты про это? это лишь предположение базирующееся на том что потоки они уникальны в системе.
регистры при том, что там ты увидишь искомое значение, которое поможет тебе понять чем отличается cin от cout при их сравнении через ==
я тебе говорю, что конкретная реализация может возвращать this, но на это надеяться нельзя, т.к. такое поведение не гарантировано. Единственной причиной того, что компилятор не считает выражение типа stream1 == stream2 (напомню, что operator == для потоков не определен) за ошибку, является тот факт, что в булевом контексте у потоков вызывается "operator unspecified-bool-type () const;", единственное предназначение которого — проверить, не случилось ли с потоком ничего плохого.
1
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 14:31  [ТС] #32
Байт, я ж в первоначальном варианте пробовал. Но, судя по прошлым постам темы, большинство сходится в том, что так делать нельзя. И, так как я сейчас на эксперименты не настроен, предпочитаю более понятный лично мне метод - перегрузку. Но как перегрузить на конкретный параметр, я не знаю.
0
Nameless One
Эксперт С++
5783 / 3432 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.03.2012, 14:32 #33
Цитата Сообщение от Байт Посмотреть сообщение
Kravensky, А чего б тебе не попробовать такой код
И не надо никого спрашивать...
Байт, в С, естественно, сработает (на то они и указатели), в С++ — нет гарантии.
1
Luke
39 / 39 / 1
Регистрация: 21.02.2012
Сообщений: 95
02.03.2012, 14:44 #34
Kravensky,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void compare (basic_ostream<char>& os)//это и есть перегрузка. все потоки вывода наследуются от него.
{
    
    if(&os==&cout)//сравнивай адреса вот и все.cout глобален его адрес не изменится
    {
        os<<"COUT";
    }
    else
    {
 
        os<<"FILE";//если на входе не cout а например ofstream 
    }
    
}
Добавлено через 1 минуту
Цитата Сообщение от Nameless One Посмотреть сообщение
Байт, в С, естественно, сработает, в С++ — нет гарантии.
в с++ при сравнении указателей - те же гарантии
2
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 14:54  [ТС] #35
Luke, дык в c++ потоки не указателями реализуются, вроде. А классами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
}
Эту функцию как исключительно для cout перегрузить? Не прибегая к шаблонам и проверке на равенство?
0
BRcr
4015 / 2305 / 156
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
02.03.2012, 14:58 #36
Цитата Сообщение от Kravensky Посмотреть сообщение
Попробовал так. Компилятор ругается на двусмысленность. А посему вопрос: как можно явно указать поток cout?
С двусмысленностью часто помогает явное указание типа, попробуйте:
C++
1
stream << ( int )output_matrix.order << endl;
1
Luke
39 / 39 / 1
Регистрация: 21.02.2012
Сообщений: 95
02.03.2012, 14:58 #37
Цитата Сообщение от Kravensky Посмотреть сообщение
дык в c++ потоки не указателями реализуются, вроде. А классами.
прошу прощения а что мешает взять адрес объекта класса?
0
Байт
Эксперт C
17715 / 11736 / 1872
Регистрация: 24.12.2010
Сообщений: 23,540
02.03.2012, 15:06 #38
Цитата Сообщение от Kravensky Посмотреть сообщение
дык в c++ потоки не указателями реализуются, вроде. А классами.
Ну да. А в Си - структурами. Но экземпляр потока будет указателем на некую область памяти. в Си, во всяком случае. Чем будет stream-поток в плюсах, я не разбирался. Но кажется
C++
1
2
  ofstream s; // просто область памяти в стеке
  ofstream *ss = new ofstream; // указатель на область памяти в куче (сам указатель - в стеке)
Путаница усугубляется передачей параметров по адресу, которая на самом деле есть передача указателя.
Если я не прав, пусть товарищи меня поправят.
1
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 15:07  [ТС] #39
BRcr, не помогло, к сожалению.
0
BRcr
4015 / 2305 / 156
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
02.03.2012, 15:12 #40
Kravensky, если вам надо только cout и еще какой-то один поток отличать, тогда сравнение по адресу cout, как предложил Luke, является, пожалуй, простейшим вариантом.
1
Kravensky
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
02.03.2012, 15:20  [ТС] #41
Хм. Теперь понял. Всем, кто помог - спасибо.
0
Байт
Эксперт C
17715 / 11736 / 1872
Регистрация: 24.12.2010
Сообщений: 23,540
02.03.2012, 15:21 #42
Опять же про чистый Си, но может быть поможет разобраться. Есть такая функция fileno(FILE *), которая выдает дескриптор файла. Если он = 1 - это stdout. 0 - stdin, 2 - stderr. Нет ли подобного метода у stream ?
0
02.03.2012, 15:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2012, 15:21
Привет! Вот еще темы с ответами:

Как сравнивать 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;)); Вот как сравнить два...


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

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

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