- •Ввод-вывод в языке с
- •Потоковые функции
- •Открытие файлов и потоков
- •Переадресация ввода-вывода
- •Изменение буфера потока
- •Форматный вывод данных
- •Функция printf()
- •Поиск в файлах с помощью функций fseek( ), ftell( ) и rewind()
- •Синхронный и асинхронный ввод/вывод
- •3. Позиционирование указателя файла.
- •6. Запись данных в файл
- •Блокировка и разблокировка файла
- •Асинхронный режим чтения и записи файлов
- •Стандартные потоки cin, coutи cerr
- •Флаги и функции форматирования
- •Файловый ввод-вывод
- •Флаг Назначение
- •Файловый ввод
- •Файловый вывод
- •Вот результаты работы программы:
- •Двоичные файлы
- •Буферы потоков
Файловый ввод
Основные функции управления потоковым вводом сосредоточены в классе istream. С каждым из объектов этого класса и его производных связан объект класса streambuf. Эти классы работают в связке: первый осуществляет форматирование, а второй управляет низкоуровневым буферизованным вводом. Функции класса istream, доступные его потомкам, перечислены в табл. 7.
Функция |
Описание |
ipfx |
Вызывается перед операцией чтения для проверки наличия ошибок в потоке |
isfx |
Вызывается после каждой операции чтения |
get |
Извлекает из потока требуемое число символов; если указан символ-ограничитель, он не извлекается |
getline |
Извлекает из потока требуемое число символов; если указан символ-ограничитель, он извлекается, но не сохраняется в буфере |
read |
Извлекает из потока требуемое число байтов; применяется при работе с двоичными потоками |
ignore |
Выбрасывает из потока требуемое число символов вплоть до символа-ограничителя |
peek |
Возвращает текущий символ, сохраняя его в потоке |
gcount |
Определяет число символов, извлеченных из потока во время последней операции чтения |
eatwhite |
Извлекает из потока ведущие пробельные символы; аналогичное действие выполняет манипулятор ws |
putback |
Возвращает в поток символы, извлеченные из него во время последней операции чтения |
sync |
Синхронизирует внутренний буфер потока с внешним источником символьных данных |
seekg |
Перемещает маркер, обозначающий текущую позицию чтения, на требуемую позицию в потоке |
tellg |
Возвращает позицию маркера чтения |
Класс ifstream является потомком класса istream, ориентированным на чтение данных из файлов. Его конструктор автоматически создает объект класса filebuf, управляющий низкоуровневой работой с файлом, включая поддержку буфера чтения. Функции класса ifstream перечислены в табл. 8.
Таблица 8. Функции класса ifstream |
|
ФУНКЦИЯ |
Описание |
open |
Открывает файл для чтения, связывая с ним объект класса filebuf |
close |
Закрывает файл |
setbuf |
Передает указанный символьный буфер в распоряжение объекта класса filebuf |
setmode |
Задает режим доступа к файлу: двоичный (константа filebuf:: binary) или текстовый (константа filebuf:: text) |
attach |
Связывает указанный открытый файл с объектом класса filebuf |
rdbuf |
Возвращает указатель на объект класса filebuf |
fd |
Возвращает дескриптор файла |
is_open |
Проверяет, открыт ли файл, связанный с потоком |
В следующей программе из файла читаются данные блоками по 80 символов, которые затем выводятся на экран:
// // ifstream.cpp //В этой программе на языке C++ демонстрируется // использование класса ifstreamдля чтения данных из файла. //
#include <fstream >
#define iCOLUMNS 80
void main(void)
{ char cOneLine[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).
После окончания вывода всего файла он закрывается командой close().