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

Вопрос про потоки вывода - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
freegat
-7 / 23 / 2
Регистрация: 05.03.2009
Сообщений: 181
01.11.2009, 06:46     Вопрос про потоки вывода #1
Здравствуйте, подскажите в чём кординальная разница между использованием cerr и cout?!?!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2009, 06:46     Вопрос про потоки вывода
Посмотрите здесь:

Потоки вывода C++
Потоки ввода-вывода в С++ C++
C++ Потоки. Event. Задача про обедающих философов.
C++ Используя потоки ввода/вывода в С++
C++ Текстовые файлы и потоки ввода/вывода
Потоки ввода-вывода C++
C++ потоки вывода
C++ Непонятная ошибка. Потоки ввода/вывода
C++ Ищу литературу про потоки
Потоки вводы и вывода C++
C++ Переделать потоки ввода-вывода на prinf и scanf
Запустить интерпретатор bash, получить потоки ввода вывода C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rustam
 Аватар для Rustam
12 / 12 / 3
Регистрация: 05.09.2009
Сообщений: 438
01.11.2009, 07:01     Вопрос про потоки вывода #2
Обмен данными между программой и внешними устройствами осуществляется с помощью операций ввода-вывода. Типичным внешним устройством является терминал. На терминале можно напечатать информацию. Можно ввести информацию с терминала, напечатав ее на клавиатуре. Другим типичным устройством является жесткий или гибкий диск, на котором расположены файлы. Программа может создавать файлы, в которых храниться информация. Другая (или эта же) программа может читать информацию из файла.

В языке Си++ нет особых операторов для ввода или вывода данных. Вместо этого имеется набор классов, стандартно поставляемых вместе с компилятором, которые и реализуют основные операции ввода-вывода.
Причиной является как слишком большое разнообразие операций ввода и вывода в разных операционных системах, особенно графических, так и возможность определения новых типов данных в языке Си++. Вывод даже простой строки текста в MS DOS, MS Windows и в X Window на-столько различен, что пытаться придумать общие для всех них операторы было бы слишком негибко и на самом деле затруднило бы работу. Что же говорить о классах, определенных программистом, у которых могут быть совершенно специфические требования к их вводу-выводу.


Библиотека классов для ввода-вывода решает две задачи. Во-первых, она обеспечивает эффективный ввод-вывод всех встроенных типов и простое, но тем не менее гибкое, определение операций ввода-вывода для новых типов, разрабатываемых программистом. Во-вторых, сама библиотека позволяет при необходимости развивать её и модифицировать.

В нашу задачу не входит описание программирования в графических системах типа MS Windows. Мы будем рассматривать алфавитно-цифровой выводу на терминал, который будет работать на консольном окне MS Windows, в MS DOS, в системе Unix и ввод-вывод файлов.
Потоки

Механизм для ввода-вывода в Си++ называется потоком. Название произошло от того,что информация вводится и выводится в виде потока байтов – символ за символом.

Класс istream реализует поток ввода, класс ostream – поток вывода. Эти классы определены в файле заголовков iostream.h. Библиотека потоков ввода-вывода определяет три глобальных объекта: cout, cin и cerr. cout называется стандартным выводом, cin – стандартным вводом, cerr – стандартным потоком сообщений об ошибках. cout и cerr выводят на терминал и принадлежат к классу ostream, cin имеет тип istream и вводит с терминала. Разница между cout и cerr существенна в Unix – они используют разные дескрипторы для вывода. В других системах они существуют больше для совместимости.

Вывод осуществляется с помощью операции >>, ввод с помощью операции <<. Выражение
cout << "Пример вывода: " << 34;

напечатает на терминале строку "Пример вывода", за которым будет выведено число 34. Выражение
int x;
cin >> x;

введет целое число с терминала в переменную x. (Разумеется, для того, чтобы ввод произошел, на терминале нужно напечатать какое-либо число и нажать клавишу возврат каретки.)
Операции << и >> для потоков

В классах iostream операции >> и << определены для всех встроенных типов языка Си++ и для строк (тип char*). Если мы хотим использовать такую же запись для ввода и вывода других классов, определенных в программе, для них нужно определить эти операции.
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
class String
{
public:
     friend ostream& operator<<(ostream& os, const String& s);
     friend istream& operator>>(istream& is, String& s);
private:
     char* str;
     int length;
};
ostream& operator<<(ostream& os, const String& s)
{
     os << s.str;
     return os;
}
istream& operator>>(istream& is, String& s)
{
// предполагается, что строк длиной более 1024 байтов не будет
     char tmp[1024];
     is >> tmp;
 
     if (str != 0) {
          delete [] str;
     }
     length = strlen(tmp);
     str = new char[length + 1];
     if (str == 0) {
          // обработка ошибок
          length = 0;
          return is;
     }
     strcpy(str, tmp);
     return is;
}
Как показано в примере класса String, операция <<, во-первых, является не методом класса String, а отдельной функцией. Она и не может быть методом класса String, поскольку ее правый операнд – объект класса ostream. С точки зрения записи, она могла бы быть методом класса ostream, но тогда с добавлением нового класса приходилось бы модифицировать класс ostream, что невозможно – каждый бы модифицировал стандартные классы, поставляемые вместе с компилятором. Когда же операция << реализована как отдельная функция, достаточно в каждом новом классе определить ее, и можно использовать запись:
String x;
. . .
cout << "this is a string: " << x;

Во-вторых, операция << возвращает в качестве результата ссылку на поток вывода. Это позволяет использовать ее в выражениях типа приведенного выше, соединяющих несколько операций вывода в одно выражение.

Аналогично реализована операция ввода. Для класса istream она определена для всех встроенных типов языка Си++ и указателей на строку символов. Если необходимо, чтобы класс, определенный в программе, позволял ввод из потока, для него нужно определить операцию >> в качестве функции friend.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.11.2009, 07:16     Вопрос про потоки вывода #3
Rustam, Ссылку на оригинал плиз.
Rustam
 Аватар для Rustam
12 / 12 / 3
Регистрация: 05.09.2009
Сообщений: 438
01.11.2009, 07:58     Вопрос про потоки вывода #4
Да пожалуйста http://www.intuit.ru/department/pl/cpp/17/
Yandex
Объявления
01.11.2009, 07:58     Вопрос про потоки вывода
Ответ Создать тему
Опции темы

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