Шаг 47 - Файловый ввод-вывод.

На эту тему я давно хотел написать. Действительно, важная вещь. Если бы речь шла не о C++ Builder, а, скажем, о Turbo C++, или cc/unix, то давно ьы уже встал этот вопрос. Но мы как-то до этого момента без специализированных файловых классов работали. Почему? Дело в том, что многие компонентные классы VCL инкапсулируют этот самый ввод-вывод. Ну например. Объекты TMemo используют метод LoadFromFile объектного свойства TStrings. Также доступен метод LoadFromStream, но о нем позже. Есть и соответствующие методы сохранения.

Но, как бы то ни было, io-классы нужны. В Билдере есть даже некоторое разнообразие. Как обычно. Обычный C вариант FILE. Раз C, значит, необъектный. Потом, STL'овские ifstream, ofstream, fstream, и так далее. Ну и наконец, собственный VCL вариант TFileStream. Последний - выходец с Делфи. Некоторым это не нравится. По мне - лишь бы работало хорошо.

По порядку.

FILE

Почему использовать это... эту архаичную вещь? Переносимость. Например, Вы пишете консольную программму-архиватор. Или что-нибудь еще в этом роде. Так как она консольная, то, при небольшой корректировке, пойдет и на UNIX, соотвественно, на Linux, OpenBSD и, скорее всего, на прочих клонах ONIX систем. Так вот. Если для функций, работающих с FILE, напрмер, fopen, fread , посмотреть Portability, то Вы будете удивлены количеством плюсиков. Оно и под Unix пашет, и под Редмондовский win32, и к стандартам ANSI C/C++ подходит. Только для работы не забывайте <stdio.h> включать.

Так как это не класс, то для работы используются функции.

fopen

Открывает или создает файл. Возвращает указатель на переменную типа FILE. В качестве параметра используется NULL-terminated строка и способ открытия, тоже как строка. В Хелпе перечислены варианты r - только для чтения. Если попробуете записать в такой файл, вылетит исключение. Вариант w - создает (переписывает заново) файл для записи. Символ a говорит, что файл открыт для обновления.

Другие варианты - r+, w+, a+ говорят о том, что файл открыт для обновления. Первый открывает существующий файл для чтения или записи, второй создает или переписывает заново файл для чтения или записи, третий открывает или создает файл для чтения или записи в конец файла.

Пример использования - fopen("c:\\test.txt","r+"). Если открытие файла не прошло успешно, возвращается NULL.

fread, fwrite

За что еще мне нравится этот вид io системы, это за возможность легкого чтения записей данных. Кто работал с TP, знает возможность использования систем вида file of <тип>. Довольно элегантный вариант оперирования всевсозможными бинарными, структурированными файлами.

Язык C предлагает аналогичный способ. Для того, чтобы считать запись произвольного типа TRecord, необходим подобный код:

FILE *stream=fopen("c:\\test.txt","r+");
TRecord record;
fread(&record,sizeof(record),1,stream);

Конечно, такое чтение записей не является прерогативой FILE, однако это один из самых простых варинтов. Параметры у fread и fwrite одинаковы. Первый - указатель на область, получающую данные. Второй - размер порции считываемых данных. Третий - количество этих самых порций. Четвертый - собственно дескриптор потока. У fwrite все, аналогично, только относится к записываемым данным.

feof

Логическая функция EOF, возвращающая true при установлении указателя на символ "конец файла", Все мы знаем циклы while(!feof(file)){ ... }. Это как раз из той категории.

fseek, ftell

Управляют текущей позицией дескриптора потока. Функция fseek реляционна. Смещение может быть относительно начала файла, его текущей позиции или конца файла. Параметры этой функции такие - дескриптор потока, смещение, определение типа смещения. Последнее как раз и определяет, от чего смещается указатель и может быть одной из трех констант:

Функция ftell с единственным параметром - дескриптором потока, передает приложению текущую позицию указателя.

fflush, fclose

Тоже знакомые имена. Первая функция сбрасывает данные из буфера обмена с файлом в файл, а вторая закрывает его.

Конечно, это не все функции этой категории. Но, я думаю, этого достаточно. Ведь есть более современные классы ввода-вывода.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 26.12.2001