|
|
Программирование >> Процедурные приложения
Глава 15. Классы ввода-вывода в языке C++ Иерархия классов ввода-вывода Файловый ввод Файловый вывод o Двоичные файлы Буферы потоков o Строковые буферы Несколько примеров форматного вывода данных В главе Основы ввода-вывода в языке C++ были даны общие представления о потоковых объектах cin, cout и cerr и операторах потокового ввода-вывода << и >>. В настоящей главе мы поговорим о стандартных классах C++, управляющих работой этих объектов. Иерархия классов ввода-вывода Все потоковые классы порождены от одного класса, являющегося базовым в иерархии, - ios. Исключение составляют лишь классы буферизованных потоков, базовым для которых служит класс streambuf. Всех их можно разделить на четыре категории, как показано в табл. 15.1. На рис. 15.1 схематически изображена иерархия классов ввода-вывода, порожденных от класса ios. Классы семейства ios предоставляют программный интерфейс и обеспечивают необходимое форматирование обрабатываемых данных, тогда как непосредственную обработку данных выполняют классы семейства streambuf, управляющие обменом данными между буфером потока и конечным устройством (рис. 15.2). Таблица 15.1. Категории классов ввода-вывода | Класс | Описание | | Содержит базовые средства управления потоками, является родительским [для других классов ввода-вывода (файл IOSTREAM.H) | Потоковый ввод 1 | stream | Содержит общие средства потокового ввода, является родительским для других классов ввода (файл IOSTREAM.H) | fstream | 1 Предназначен для ввода данных из файлов (файл FSTREAM.H) | stream withassign | Поддерживает операцию присваивания; существует предопределенный объект cin данного [класса, по умолчание читающий данные из стандартного входного потока, но благодаря операции присваивания этот объект может быть переадресован на различные объекты класса istream(файл IOSTREAM.H) | strstream | Предназначен для ввода данных из строковых буферов (файл STRSTREA.H) | Потоковый вывод 1 | ostream | 1 Содержит общие средства потокового вывода, является родительским для других классов [вывода (файл IOSTREAM.H) | ofstream | Предназначен для вывода данных в файлы (файл FSTREAM.H) | ostream withassign | Поддерживает операцию присваивания; существуют предопределенные объекты cout, cerr и clog данного класса, по умолчанию выводящие данные в стандартный выходной поток, но благодаря операции присваивания их можно переадресовать на различные объекты класса Iostream (файл IOSTREAM.H) | ostrstream | Предназначен для вывода данных в строковые буферы (файл STRSTREA.H) | Потоковый ввод-вывод 1 | ostream | Содержит общие средства потокового ввода-вывода, является родительским для других [классов ввода-вывода (файл IOSTREAM.H) | fstream | Предназначен для организации файлового ввода-вывода (файл FSTREAM.H) |
strstream | Предназначен для ввода-вывода строк (файл STBLSTREA.H) | stdiostream | Поддерживает работу с системными средствами стандартного ввода-вывода, существует для совместимости со старыми функциями ввода-вывода (файл STDIOSTR.H) | Буферизованные потоки | streambuf | Содержит общие средства управления буферами потоков, является родительским для других буферных классов (файл IOSTREAM.H) | filebuf | Предназначен для управления буферами дисковых файлов (файл FSTREAM.H) | strstreambuf | 1 Предназначен для управления строковыми буферами, хранящимися в памяти (файл STRSTREA.H) | stdiobuf | Осуществляет буферизацию дискового ввода-вывода с помощью стандартных системных функций (файл STDIOSTR.H) |
Рис. 15.1. Иерархия классов ввода-вывода порожденных от ios
Рис. 15.2. Иерархия классов, порожденных от streambuf Файловый ввод Основные функции управления потоковым вводом сосредоточены в классе istream. С каждым из объектов этого класса и его производных связан объект класса streambuf. Эти классы работают в связке: первый осуществляет форматирование, а второй управляет низкоуровневым буферизованным вводом. Функции класса istream, доступные его потомкам, перечислены в табл. 15.2. Функция | Описание | | [Вызывается перед операцией чтения для проверки наличия ошибок в потоке | | [Вызывается после каждой операции чтения | | [Извлекает из потока требуемое число символов; если указан символ-ограничитель, он не извлекается | getline | Извлекает из потока требуемое число символов; если указан символ-ограничитель, он извлекается, но не сохраняется в буфере | read | ИИзвлекает из потока требуемое число байтов; применяется при работе с двоичными потоками |
gnore ИВыбрасывает из потока требуемое число символов вплоть до символа-ограничителя | peek | Возвращает текущий символ, сохраняя его в потоке | gcount | Определяет число символов, извлеченных из потока во время последней операции чтения | eatwhite | Извлекает из потока ведущие пробельные символы; аналогичное действие выполняет манипулятор ws | putback | [Возвращает в поток символы, извлеченные из него во время последней операции чтения | sync | Синхронизирует внутренний буфер потока с внешним источником символьных данных | seekg | Перемещает маркер, обозначающий текущую позицию чтения, на требуемую позицию в потоке | tellg | Возвращает позицию маркера чтения | Таблица 15.2. Функции класса istream |
Класс ifstream является потомком класса istream, ориентированным на чтение данных из файлов. Его конструктор автоматически создает объект класса filebuf, управляющий низкоуровневой работой с файлом, включая поддержку буфера чтения. Функции класса ifstream перечислены в табл. 15.3. Таблица 15.3. Функции класса ifstream | ФУНКЦИЯ | Описание | open | Открывает файл для чтения, связывая с ним объект класса filebuf | close | Закрывает файл | setbuf | Передает указанный символьный буфер в распоряжение объекта класса filebuf | setmode | Задает режим доступа к файлу: двоичный (константа filebuf:: binary) или текстовый (константа filebuf:: text) | attach | Связывает указанный открытый файл с объектом класса filebuf | -dbuf | Возвращает указатель на объект класса filebuf | | Возвращает дескриптор файла | s open | Проверяет, открыт ли файл, связанный с потоком |
В следующей программе из файла читаются данные блоками по 80 символов, которые затем выводятся на экран: ifstream.cpp В этой программе на языке C++ демонстрируется использование класса ifstreamдля чтения данных из файла. #include <fstream.h> #define iCOLUMNS 80 void main(void) charcOneLine[iCOLUMNS]; fstream ifMyInputStream( IFSTREAM.CPP ); while(ifMylnputStream) { ifMylnputStream.getline(cOneLine, iCOLUMNS); cout << \n << cOneLine; ifMylnputStream.close(); Конструктор клаccа ifstream создает объект ifMylnputStream, связывая с ним файл IFSTREAM.CPP, который открывается для чтения (по умолчанию в текстовом режиме). Этот объект можно использовать в условных операторах, проверяя его на равенство нулю, что означает достижение конца файла. Функция getline(), унаследованная от класса istream, читает в массив cOneLineстроку текста длиной iCOLUMNS(80 символов). Ввод будет прекращен при обнаружении символа новой строки \n, конца файла или, если ни одно из этих событий не произошло, 79-го по счету символа (последним записывается символ \0).
|