Для работы с бинарными файлами в языке C++ используется стандартная библиотека для работы с файлами (см. функции для работы с текстовыми файлами fscanf и fprintf), но с небольшими изменениями.
Так, например, для чтения бинарного файла применяется параметр «rb», а не обычный «r». Аналогично и с модификаторами записи «w», добавления «a», чтения и записи «r+», «w+», «a+»: «wb», «ab», «rb+», «wb+», «ab+». Как и для обычных файлов наличие буквы w обозначает, что файл будет создан в случае отсутствия, а, если файл уже есть, то его содержимое будет удалено и заменено новым. А наличие буквы a значит, что файл будет создан в случае отсутствия, но содержимое файла не будет уничтожено.
Весь процесс идет по аналогии с обычным текстовым файлом, но есть некоторые нюансы. Работа идет именно с битами, так что возможна запись или считывание различных управляющих символов, например, “\n”, который заканчивает строку и начинает новую.
Так же еще одним моментом служит произвольный доступ к данным в бинарном файле. Благодаря функции
1 |
fseek(файловая переменная, расстояние, SEEK_SET или SEEK_CUR или SEEK_END); |
можно получить доступ к любому участку файла. Причём SEEK_SET означает, что отсчёт идёт от начала файла, SEEK_CUR - от курсора, SEEK_END - от конца файла. Для расчёта расстояния (количества бит, на которые сдвинется указатель) удобно использовать команду sizeof().
Также стоит отметить функцию записи в файл
1 |
fwrite(ссылка на записываемые данные, размер записываемого данного, количество записываемых данных, файловая переменная); |
и аналогичную функцию чтения из файла с теми же параметрами.
Рассмотрим далее пример записи в бинарный файл и чтения из него. Записывать будем пакеты с данными, представленные с помощью структуры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <stdio.h> // подключаем функции дл работы с файлами #include <conio.h> // подключам getch struct int_double // в файл будем записывать пакеты { int i; double d; }; int main(int argc, char* argv[]) { int_double pack; // пакет FILE *f; // переменная для работы с файлом int i; // счётчик f=fopen("D:\\1\\alc.dat", "ab+"); // открываем бинарный файл для записи и чтения в режиме добавления, то есть, если файла нет, то он создастся, а если файл есть, то содержимое файла не будет уничтожено, из файла можно будет читать и в файл можно будет записывать pack.i=0; // инициализация пакета pack.d=0.0; for (i=0; i<10; i++) // запишем в файл в цикле 10 пакетов { pack.i=pack.i+1; pack.d=pack.d+11; fwrite(&pack, sizeof(int_double), 1, f); // записываем в файл f ровно 1 пакет pack размера int_double } fseek(f, 4*sizeof(int_double), SEEK_SET); // перемещаемся от начала (SEEK_SET) файла f на 4 длинны пакета int_double, то есть к началу 5-го пакету fread(&pack, sizeof(int_double), 1, f); // считываем из файла f ровно 1 пакет pack размера int_double printf("%d %f",pack.i,pack.d); // выводим 5-й пакет (5 55.0) на экран getch(); // ожидаем нажатия пользователем клавиши fclose(f); // закрываем файл return 0; // возвращаем 0 - правило хорошего тона } |