Сьогодні ми розглянемо роботу з бінарними файлами в мові Сі
На відміну від текстових файлів доступ до елементів бінарних файлів виконується в довільному порядку, а не послідовно. Тому бінарні файли називають файлами довільного доступу.
Додаток, в якому передбачається використовувати файли довільного доступу, має їх створювати. Всі записи в такому файлі повинні бути однакової фіксованої довжини. Дані можуть бути вставлені в файл прямого доступу без руйнування інших даних, змінені або видалені без перезапису всього файлу.
Для отримання доступу до бінарним файлу (потоку) в 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):