Сегодня мы рассмотрим работу с бинарными файлами в языке Си
В отличие от текстовых файлов доступ к элементам бинарных файлов выполняется в произвольном порядке, а не последовательно. Поэтому бинарные файлы называют файлами произвольного доступа.
Приложение, в котором предполагается использовать файлы произвольного доступа, должно их создавать. Все записи в таком файле должны быть одинаковой фиксированной длины. Данные могут быть вставлены в файл прямого доступа без разрушения других данных, изменены или удалены без перезаписи всего файла.
Для получения доступа к бинарному файлу(потоку) в MVS нужно:
-
Создать поток соответствующего типа:
ifstream- для ввода из файла ;
ofstream- для вывода в файл;
fstream - для обмена с файлом в двух направлениях.
-
Связать его с файлом данных и открыть (open) для работы в определенном режиме, с обязательным указанием двоичного режима ios::binary(по умолчанию потоки открываются в текстовом режиме):
void ifstream::open(const char *имя_файла, openmode режим=ios::in|ios::binary);
void ofstream::open(const char *имя_файла,
openmode режим=ios::out|ios::trunс|ios::binary);
void fstream::open(const char *имя_файла,
openmode режим=ios::in|ios::out|ios::binary);
где имя_файла – имя файла, в которое может входить спецификатор пути;
режим – задает режим открытия файла (см. лаб. раб. №10).
-
Обмен данными с файлом через поток: запись в поток; чтение из потока; управление состоянием потока.
Для записи в поток в C++ используется метод write:
basic_ostream<_Elem, _Tr>& write( const char_type *_Str, streamsize _Count );
Для чтения из потока используется метод read:
basic_istream<_Elem, _Tr>& read( const char_type *_Str, streamsize _Count );
_Countчисло выводимых (вводимых) в поток байт
_Strсимволы выводимые(вводимые) в (из) поток(а)
Произвольный доступ к файлу осуществляется путем установки текущей позиции в файле с помощью методов:
для потоков открытых на ввод:
basic_istream<_Elem, _Tr>& seekg( pos_type _Pos );
basic_istream<_Elem, _Tr>& seekg( off_type _Off, ios_base::seekdir _Way );
для потоков открытых на вывод в C++ пишется так:
basic_ostream<_Elem, _Tr>& seekp( pos_type _Pos );
basic_ostream<_Elem, _Tr>& seekp( off_type _Off, ios_base::seekdir _Way );
_Posпозиция в потоке для чтения (номер байта)
_Off позиция относительно _Way.
_Wayодно из перечислений ios_base (beg, cur, end):
перечисление
|
описание
|
ios_base::beg
|
начало файла
|
ios_base::end
|
конец файла
|
ios_base::cur
|
текущая позиция
|
Например:
ofstream fout(“my.dat”,ios::ate|ios::binary);
//устанавливаем указатель на начало потока
fout.seekp(0);
fout.write((char *) &el,sizeof el);
ifstream fin(“my.dat”,ios::ate|ios::binary);
//передвигаем указатель на 10 байт перед концом потока
fin.seekg(-10, ios_base::end);
fin.read((char *) &el,sizeof el);
В языке Си с помощью функции booleof(); можно определить, был ли достигнут конец файла ввода.
-
Для закрытия потока используется функция close().