Потоки ввода-вывода
Потоком ввода-вывода называется абстрактное понятие, относящееся
к любому переносу данных от источника (или поставщика данных) к приемнику (или потребителю) данных.
В Турбо и Borland C++ используется новый способ работы с потоками ввода-вывода, который заключается в использовании операций '>>' и
'<<'. Функции потоков сокращают время разработки программы, избавляя
от необходимости непосредственно иметь дело с различными типами форматов, которые требуются для функций рrintf и scanf. Ниже показан сравнительный пример:
Си Турбо и Borland C++
#include <stdio.h> #include <iostream.h>
main() main()
{ {
int k; int k;
printf("Введите число: "); cout << "Введите число: ";
scanf("%d", &k); cin >> k;
printf("Число: %d\n", k); cout << "Число: " << k;
} }
cout - стандартный выходной поток (по умолчанию - экран). Данные
(например, значения переменных и строки) посылаются в поток с помощью
операции <<. Операция << (читающаяся как "поместить в...") пересылает
данные справа от нее в поток слева.
cin - стандартный входной поток (обычно - клавиатура). Значения,
вводимые с клавиатуры, присваиваются переменным с помощью операции
>>. Использование операций >> и << для потоков ввода/вывода является
типичным примером переопределения операций в С++ (см. "Переопределение операций").
Кроме cout и cin в библиотеке iostream предопределены - cerr
(стандартное устройство для вывода сообщений об ошибках, соответствующее stderr в Си) и clog (полностью буферизованная версия cerr (в Си
эквивалента нет).
Реальное преимущество при работе с потоками С++ заключается в
той простоте, с какой можно переопределять операторы << и >> при работе с собственными типами данных. В C++ есть два класса, istream и
ostream, которые можно использовать для ввода в объекты и вывода из
них. Возможно написание собственных функций элементов работы с потоками, что и демонстрируется в следующем примере:
struct clock { // Простая структура данных
int hr, min, sec;
clock( int h, int m, int s) { hr = h; min = m; sec = s; }
};
Для переопределения << для вывода объектов типа clock требуется
следующее определение:
Поток вывода из объекта и '<<'
v v v
ostream& operator<<(ostream& strm, clock& c)
{
strm << c.hr << ":" << c.min << ":" << c.sec;
} ^
Возможно повторное использование
операции
Заметим, что переопределенная операция << должна возвращать
ostream&, то есть ссылку на ostream, Теперь можно организовать вывод
для объектов типа clock следующим образом:
clock c(12,31,55);
cout << c;
Вывод на принтере будет следующим:
12:31:55
Дополнительную информацию о потоках ввода-вывода можно получить
в руководстве программиста Турбо и Borland C++. В нем дана детальная
информация: по библиотеке iostream (определенной в файле iostream.h);
о форматировании ввода и вывода; о манипуляторах потока; вводе-выводе
в файл; режимах открытия файла; строковой обработке потока, а также
всех классах потоков: filebuf, fstream, fstreambase, ifstream, ios,
iostream, iostream_withassign, istream, istream_withassign,
istrstream, ofstream, ostream, ostream_withassign, ostrstream,
streambuf, strstreambase, strstreambuf, strstream.