Бинарные файлы c++ | Работа с бинарными файлами в с++
Сегодня мы рассмотрим работу с бинарными файлами в языке Си В отличие от текстовых файлов доступ к элементам бинарных файлов выполняется в произвольном порядке, а не последовательно. Поэтому бинарные файлы называют файлами произвольного доступа. Приложение, в котором предполагается использовать файлы произвольного доступа, должно их создавать. Все записи в таком файле должны бытьодинаковой фиксированной длины. Данные могут быть вставлены в файл прямого доступа без разрушения других данных, изменены или удалены без перезаписи всего файла.
Для получения доступа к бинарному файлу(потоку) в MVS нужно:
ifstream- для ввода из файла ; ofstream- для вывода в файл; fstream - для обмена с файлом в двух направлениях.
void ifstream::open(const char *имя_файла, openmode режим=ios::in|ios::binary); void ofstream::open(const char *имя_файла, void fstream::open(const char *имя_файла,
где имя_файла – имя файла, в которое может входить спецификатор пути; режим – задает режим открытия файла (см. лаб. раб. №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):
Например: 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(); можно определить, был ли достигнут конец файла ввода.
|