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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вывести все четные и нечетные числа массива http://www.cyberforum.ru/cpp-beginners/thread60327.html
Здравствуйте!!! У меня есть такое задание не могу решать может поможете?? 1. Надо заполнить все дни января(31 день), в которых был снег(snow) и ввести время падания снега или если осадков не было...
C++ DOS-866 в Unicode (UTF-8) Замаялся с кодировками. в файле данные в Unicode (UTF-8) у меня в консольнмо приложении в DOS-866. начинаю сливать данные из консоли и из моего файла, получается смесь дикая и половина текста не... http://www.cyberforum.ru/cpp-beginners/thread60309.html
программа расчета и отображения накладной C++
кто умеет такое решитьУпражнение 2.1. Напишите программу вычисления периметра и площади прямо-угольника. Длины сторон прямоугольника должны вводиться пользователем с клавиатуры, а результаты с...
C++ Обьединение в С.
Данные о продукции, выпускаемой машиностроительным предприятием, оформлены в виде массива объединений. написать программу ,которая вводит данные в память машины в диалоге, выводит данные виде...
C++ Написать функцию чтобы случайным образом забивался массив http://www.cyberforum.ru/cpp-beginners/thread60260.html
Доброе время суток. Хочу на С++ написать функцию чтобы случайным образом забивался массив числами от 5 до 10, но что то не выходит. Подскажите что нужно изменить: #include <iostream> using...
C++ Что обозначает этот инкремент ? znaiu chto zasmeete novichka za etot vopros no chto oznachaet podobnii increment? : int x = 5; x+=x; // eto znaiu chto oznachaet : x=x+x x=+x; // <------- A VOT ETO CHTO ?!? подробнее

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

В языке Си++ нет особых операторов для ввода или вывода данных. Вместо этого имеется набор классов, стандартно поставляемых вместе с компилятором, которые и реализуют основные операции ввода-вывода.
Причиной является как слишком большое разнообразие операций ввода и вывода в разных операционных системах, особенно графических, так и возможность определения новых типов данных в языке Си++. Вывод даже простой строки текста в 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.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru