Состояние потока можно проверять непосредственно в условиях if и while. Например, ввод массива Целых значений можно выполнять в цикле таким образом:
int аа[10] = {0}; i = 0;
while(cin >> aa[i++]);
Цикл завершается по одной из двух причин:
1. Создалась ситуация конца файла, что для входного потока эквивалентно нажатию комбинации клавиш Ctrl+Z.
2. В потоке встретился символ, не соответствующий типу вводимой переменной. В этом случае поток переводится в состояние fail.
Например допустим, мы поочередно нажали следующие клавиши: 1, пробел, 2, пробел, 3, пробел, 4, пробел, 5, е, 6, Enter. Тогда элементы массива а а будут иметь следующие значения:
аа[0] = 1; аа[1] = 2;
Обычно операции обмена с текстовым файлом сопровождаются преобразованием информации аналогично тому, как это происходит для стандартных потоков. По нашей классификации, приведенной в начале главы, текстовые файлы являются форматируемыми. Форматирование не выполняется только в том случае, если содержимое текстового файла обрабатывается именно как символы и строки.
Двоичные файлы не разбиваются на строки, и никаких преобразований при обмене не выполняется — двоичные файлы не являются форматируемыми. Это, во-первых, означает, что операции обмена для двоичных файлов выполняются быстрее. Во-вторых, при операции записи в двоичный файл попадает ровно столько байтов, сколько записываемый объект занимает в памяти. Например, целое число, записанное в двоичный файл, займет на диске sizeof (int) байтов. Это существенно отличается от записи в текстовый файл, где количество записываемых по умолчанию символов зависит от величины числа. Например, число 12 в текстовом файле займет 2 или 3 байта (в зависимости от того, выводится ли число со знаком или без него), а 123 456 — 6 или 7 байт. Примером двоичного файла является исполняемый файл (с расширением ехе).
Файлы, естественно, связываются с потоками (см. п. п. 27.8.1 в [1]). Для использования файловых потоков необходимо задать в программе оператор
#include <fstream>
Объекты типа f stream связываются с файлами, которые можно читать и в которые можно записывать информацию. Так как класс basic_f stream (см. п. п. 27.8.1.11 в [1]) является наследником от basic_iostream (см. листинг 14.1), все операции ввода-вывода, описанные ранее для стандартных потоков, работают и с файловыми потоками.
Если нам нужны только входные (см. п. п. 27.8.1.5 в [1]) потоки-файлы, достаточно использовать оператор
#include <ifstream>
Для работы с выходными (см. п. п. 27.8.1.8 в [1]) файловыми потоками можно задать оператор
#include <ofstream>
Впрочем, заголовок <fstream> объединяет то и другое, поэтому программисты редко используют последние два варианта.
ПРИМЕЧАНИЕ
В некоторых реализациях заголовок <fstream> включает объявление <iostream>, поэтому при использовании первого можно не прописывать в программе второго. Однако в системе Visual C++.NET 2003 требуется подключать обе библиотеки, если используются оба вида потоков. |