Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие2013_09_28.doc
Скачиваний:
24
Добавлен:
20.05.2015
Размер:
2.72 Mб
Скачать

14. Файлы. Потоковый ввод-вывод

Файл–физический объект, который содержит данные. Работа с файлами в С++ реализуется либо средствами методов ООП, либо с помощью функций, унаследованных от стандартной библиотеки С для работы с потоками. Каждый способ имеет свои преимущества. В программах, не использующих механизм классов и объектов, удобнее использовать потоковый ввод-вывод в стиле языка С.

В С/С++ все файлы рассматриваются как неструктурированный поток (последовательность) байтов (т.е. никакой логической структуры не предполагается). Физически поток представляет файл или устройство (клавиатура, дисплей, принтер), снабженный средствами буферизации.

Буферизация.

Потоковый ввод-вывод позволяет обрабатывать данные различных размеров и форматов, обеспечивая при этом буферизированный ввод и вывод. Таким образом, поток – это файл снабженный средствами буферизации. Буферы операционной системы реализуются в виде участков основной памяти фиксированного размера (чаще всего 512 и 1024 байта), который определен как константа стандартной библиотеки BUFSIZ. Буферизация используется для уменьшения числа операций с магнитным диском.

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

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

Стандартная библиотека

Для работы с файлами в языке С необходимо использовать заголовочный файл стандартной библиотеки, который содержит определения макросов, константы и переменные, объявления функций и типов. Называется он <stdio.h>.

Функции, объявленные в <stdio.h>, являются весьма популярными благодаря тому, что являясь частью Стандартной библиотеки языка С, они гарантируют работу на любой платформе, поддерживающей С.

В заголовочном файле <stdio.h> определен весьма важный тип данных – структура FILE.

/* Definition of the control structure for streams

*/

typedef struct {

short level; /* fill/empty level of buffer */

unsigned flags; /* File status flags */

char fd; /* File descriptor */

unsigned char hold; /* Ungetc char if no buffer */

short bsize; /* Buffer size */

unsigned char _FAR *buffer; /* Data transfer buffer */

unsigned char _FAR *curp; /* Current active pointer */

unsigned istemp; /* Temporary file indicator */

short token; /* Used for validity checking */

} FILE; /* This is the FILE object */

Эта структура описывает сущность, с которой ассоциируется любой поток, используемый для ввода-вывода. Она содержит дескриптор файла, указатель текущей позиции в файле, индикатор конца файла, индикатор ошибок, указатель на буфер потока и его размер. Прежде чем начать работать с потоком, его следует открыть. Когда поток открывается для ввода-вывода, он связывается со структурой FILE.

Замечание. Указатель текущей позиции в файле (текущий указатель файла) определяет то место в файле, откуда начинается чтение или запись потока.

Существует несколько предопределенных указателей на потоки, которые автоматически инициализируются при запуске программы. Это:

  • stdin– указатель наFILE, указывающий на стандартный поток ввода (обычно клавиатура)

  • stdout– указатель наFILE, указывающий на стандартный поток вывода (обычно дисплей терминала)

  • stderr– указатель наFILE, указывающий на стандартный поток ошибок (обычно дисплей терминала)

Также определены еще два специализированных потока, это stdprnиstdaux, для работы с принтером и стандартным последовательным портом. Эти потоки употребляются реже.

Константы

В заголовочном файле <stdio.h> определен ряд констант, некоторые из них представлены ниже.

#define NULL 0

макрос, расширяющий константу нулевого указателя; то есть, константу, представляющую значение указателя, гарантированно указывающего несуществующий адрес объекта в памяти.

#define EOF (-1) /* End of file indicator */

отрицательное целое число типа int, используемое для обозначения конца файла.

#define BUFSIZ 512 /* Buffer size for stdio */

целое число, равное размеру буфера, используемое функцией setbuf()

#define SEEK_CUR 1

#define SEEK_END 2

#define SEEK_SET 0

целые числа, которые могут быть переданы функции fseek() для запроса позиционирования относительно текущей позиции в файле либо конца или начала файла соответственно.