double arrow

СТАНДАРТНЫЕ КЛАССЫ ПОТОКОВ

По направлению передачи данных различают следующие потоки:

è входные (input), или потоки ввода, из которых читаются данные в переменные программы;

è выходные (output), или потока вывода, в которые записываются значения из программы;

è двунаправленные (input-output), или потоки ввода-вывода, допускающие чтение и запись данных.

 

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

Двунаправленные потоки имеют свойства входных и выходных потоков. Потоки такого класса имеет смысл использовать для файлов, к которым можно организовать произвольный доступ. С файлами, хранящимися на дискетах или жестких дисках и не имеющими атрибута "только для чтения", можно работать через поток следующим образом. Перед операцией записи-чтения очередной порции данных можно установить требуемую позицию в файле, начиная с которой и будет осуществляться очередной обмен данными. Такое позиционирование обеспечивает доступ к произвольному байту, а не только к очередному следующему байту, как при последовательном доступе к файлу. Поток и связанный с ним файл представляют в программе единый объект, поэтому обычно говорят о позиционировании (seek) потока.

По способу создания различают потоки следующих видов:

è автоматически создаваемые стандартные потоки, которые связаны со стандартными системными устройствами ввода-вывода;

è явно создаваемые потоки для обмена данными с файлами;

è явно создаваемые потоки для обмена данными со строкой в оперативной памяти;

При подключении заголовочного файла iostream.h в программе на C++ автоматически создаются 4 стандартных потока:

è cin — стандартного ввода данных (по умолчанию с клавиатуры);

è cout — стандартного вывода данных (по умолчанию на монитор);

è сеrr — небуферизованный поток для стандартного вывода сообщений об ошибках (по умолчанию на монитор);

è clog — буферизованный поток для стандартного вывода сообщений об ошибках (по умолчанию на монитор).

 

< Примечание >

Потоки cin, cout и cerr соответствуют потокам stdin, stdout и stderr языка С.

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

tstpgm < tstpgm.in > tstpgm.out

будут переопределены связи стандартных потоков ввода-вывода. И во время выполнения программы из файла tstpgm.exe ввод через cin будет производиться из файла tstpgm.in, а вывод через cout — в файл tstpgm. out.

Использование потоков cerr и clog упрощает создание программ на языке C++ для сред, в которых имеются специальные внешние устройства для немедленного вывода сообщений об ошибках через cerr и сохранения этих сообщений в файле регистрации ошибок errors log.

Для работы с другими файловыми устройствами потоки в программе нужно создавать явно, задавая требуемые свойства потоков. Для большинства задач эти потоки могут быть объектами стандартных классов, объявленных в файлах fstream.h и sstream.h (strstrea.h).

 

< Примечание >

Базовые свойства всех потоков содержит класс ios, объявленный в файле iostream.h.

Если в программе требуется работать с файлами через потоки, то необходимо подключать файл fstream.h. Тогда можно создавать потоки следующих классов:

è ifstream — для ввода из файлов;

è ofstream — для вывода в файл;

è fstream — для обмена с файлом в двух направлениях.

В файле sstream.h (strstrea.h) объявлены классы потоков для обмена, данными с оперативной памятью, в которой выделена специальная область. Эта область рассматривается как массив символов или строка типа string. При подключении файла sstream.h (strstrea.h) в программе можно создав потоки шести аналогичных классов:

è istrstream, istringstream

è ostrstream, ostringstream

è strstream, stringstream

для работы с массивом символов и строкой типа string, соответственно.

Ниже приведен фрагмент иерархии стандартных классов потоков (рис.5.3)

 

В последнем стандарте языка C++ возможности библиотеки классов потоков расширены, имеются отличия в названиях и реализации классов. Приведенные имена классов используются в MVC++.

Процесс работы с файлом через потоки включает 4 этапа:

è Создание потока.

è Связывание потока с файлом и открытие файла в определенном режиме.

è Обмен данными с файлом через поток.

è Разрыв связи потока с файлом.

 

 

 

 


Рис.5.3 Стандартные классы потоков

При работе со стандартными потоками действия этапов 1, 2 и 4 выполняются автоматически. Стандартные потоки cin, cout, cerr и clog называют также предопределенными потоками, поскольку связь их с файловыми устройствами определена до начала выполнения первого оператора программы. Поток cin является объектом класса istream. Соответственно, потоки cout, cerr  и  clog — это объекты класса ostream. Классы стандартных потоков являются наследниками классов istream и ostream соответственно.

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

 

При выполнении этапов 2, 3, 4 следует контролировать наличие ошибок ввода- вывода.

Каждый поток, как и всякий объект, в любой момент времени характеризуется состоянием, определяющим свойства потока и зависящим от работы с потоком. Состояние представляется набором трех групп переменных:

è флагов (признаков) состояния потока и указателя, определяющего связь потока с другим потоком;

è флагов и переменных форматирования, выполняемого в потоке;

è переменной, хранящей текущую позицию потока и флаги режимов работы с файлами.

Состояние потока определяется также содержимым буфера потока.

Анализ флагов состояния позволяет установить наличие ошибок ввода-вывода и возможность дальнейшей работы с потоком. Для этого используются функции-члены класса ios.

При анализе состояния потока важным понятием является событие "конец файла" (End Of File, EOF). Это событие возникает при попытке чтения из потока, в то время как текущая позиция потока равна размеру файла. То есть операция ввода выполняется после того, как уже был считан последний байт файла или файл пуст. При этом устанавливается соответствующий флаг состояния. Функции ввода-вывода могут возвращать значение EOF не только при возникновении события "конец файла", но и при возникновении ошибок ввода-вывода. Данное событие используют для завершения считывания данных из файлов.

В зависимости от наличия или отсутствия форматирования различают два варианта ввода-вывода:

è форматированный;

è неформатированный.

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

Флаги форматирования определяют поведение потока при форматированном вводе-выводе с помощью операций >> и << (извлечения и вставки). Флаги переменные форматирования задают установленные в потоке правила форматирования, которые действуют при выполнении операций >> и <<. Управлять флагами и устанавливать значения переменных форматирования можно с помощью соответствующих методов класса ios или с помощью специальных функций — манипуляторов, часть из которых объявлена в файле iomanip.h, а остальные — в файле iostream.h. При создании потоков действуют единые правила форматирования, установленные по умолчанию.

Неформатированный ввод-вывод осуществляется с помощью функций-членов get (), put (), read () и write () соответствующих классов istream, ostream, iostream. При этом можно выделить два варианта организации: строко-ориентированный и символьный. Первый вариант удобен для работы с текстовыми файлами. Символьный ввод-вывод используется, в первую очередь, для работы с бинарными файлами.

Ранее мы рассматривали форматированный ввод-вывод через стандартные потоки cin и cout, при котором использовались параметры форматирования по умолчанию. Рассмотрим возможности форматирования для стандартных потоков и другие варианты организации ввода-вывода.

 



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: