Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Обробка бінарних файлів






Теоретичні основи

Зовнішнє ім’я файлу зазначається з урахуванням методики його по­дання для операційної системи. Воно може бути подане в повному вигляді (диск, шлях, ім’я: " C: \\Users\\a.dat") або в скороченому – з ураху­ванням принципів умовчання, що закладені в роботу операційної системи, а саме:

· якщо не зазначене ім’я диска, то розглядається активний диск;

· якщо не зазначений шлях до файлу, то розглядається поточна папка (поточний каталог);

· якщо шлях починається не із символу \, то відлік шляху почи­нається з поточної папки (слід пам’ятати про те, що в мові Сі символ \ є управляючим і в разі необхідності його подання він подвоюється: '\\').

Потокове введення/виведення

На рівні потокового введення/виведення обмін даними здійснюється за байтами. Такі введення/виведення можливі для друкувального при­строю, дисплея і дискових файлів. Функції бібліотеки введення/виведення, дозволяючи обробляти дані різних форматів, забезпечують при цьому бу­феризацію процесів введення і виведення.

Потік – це файл разом із засобами буферизації. При роботі з потоком можна:

· відкривати і закривати потоки (зв’язувати покажчики на потоки з конкретними файлами);

· вводити і виводити дані;

· аналізувати помилки потокового введення/виведення і умову до­сягнення кінця потоку (файлу);

· керувати буферизацією;

· керувати покажчиком поточної позиції у потоці.

Якщо потік відкритий, то з ним зв’язується так званий покажчик (ін­дикатор) поточної позиції. Читання/записування даних здійснюється почи­наючи з того байту файлу, на який вказує цей покажчик. При цьому покажчик поточної позиції автоматично «переміщається» по файлу на ту кількість байт, що відповідає зчитаному/записаному обсягу інформації. Результатом є те, що наступний сеанс читання/записування здійснюва­тиметься з орієнтацією на нове положення покажчика поточної позиції.

Обробка бінарних файлів

Бібліотечні функції уведення/виведення підключаються через заго­ловний файл stdio.h, який, у свою чергу, автоматично підключається при підключенні файлу iostream.

Взагалі кажучи, файли зберігаються в бінарному (двійковому) фор­маті і тільки режим відкриття визначає, як програма повинна інтерпре­тувати вміст файлу. Текстовий режим є режимом за умовчанням, і в цьому режимі окремо інтерпретується послідовність з двох символів – «повер­нення каретки» ('\xD', десятковий код 13) і «переведення рядка» ('\xA', десятковий код 10). Бінарний режим відкриття файлу забезпечує сприйняття всіх символів окремо, у тому числі й символів '\xD' і '\xA'. Бінарні файли не створюються текстовими редакторами, але мо­жуть бути створені за допомогою засобів мови C++ (або C).

Для забезпечення доступу до файлового потоку, як і при обробці текстових файлів, використовується покажчик на тип FILE, що визначе­ний у заголовному файлі stdio.h:

FILE *ім’я_покажчика;

Перед початком роботи з потоком (як і для текстового файлу), його потрібно відкрити, для чого застосовується функція fopen(), яка зв’язує потік з конкретним файлом, повертаючи при цьому значення покажчика на потік:

FILE *fopen(char * ім’я_файлу, char *режим_відкриття);

Параметри ім’я_файлу і режим_відкриття задаються або звичайними символьними масивами, або покажчиками на початок області пам’яті, у якій зберігається рядок символів.

Щоб вказати про необхідність відкриття файлу в бінарному режимі рядок, у якому вказується режим відкриття доповнюється літерою b від­носно відповідного стандартного режиму для текстового файлу. Таким чи­ном, режимами відкриття для бінарних файлів є:

· " wb" – відкриття нового бінарного файлу для записування;

· " rb" – відкриття існуючого бінарного файлу для читання;

· " ab" – бінарний файл відкривається (або створюється, якщо він відсутній) для дозаписування в кінець;

· " wb+" – новий бінарний файл відкривається для записування, читання і подальшого багаторазового виправлення з можливістю дозаписування в кінець файлу;

· " rb+" – існуючий бінарний файл відкривається як для читання, так і записування;

· " ab+" – бінарний файл відкривається або створюється (якщо він відсутній) як для читання, так і записування, причому записування здійснюється завжди в кінець файлу незалежно від положення покажчика поточної позиції.

Як і для текстових файлів, відкриття існуючого бінарного файлу в режимі " wb" або " wb+" забезпечує його повне відновлення.

Приклади відкриття бінарних файлів:

#include < iostream>
// Текст програми
FILE *f1, *f2, *f3;
// Текст програми
f1 = fopen(" a.dat", " rb");
char OutFileName[] = " C: \\USERS\\result.dbl";
f2 = fopen(OutFileName, " wb");
char *FileName = new char [256];
cout < < " \nInput the name of new file\n";
cin.getline(FileName, 256);
f3 = fopen (FileName, " w");

При помилках у відкритті потоку покажчик набуває значення NULL. Тому необхідно здійснювати перевірку значення покажчика, що можна зробити, наприклад, так:

FILE *f;
if ((f = fopen(" a.dat", " rb")) == NULL)
{ // Дії при помилці
}

Закриття потоку здійснюється функцією

int fclose(FILE * покажчик_на_потік);

Повторне відкриття потоку потрібно передувати його закриттям.

При відкритті файлу в режимах " wb", " wb+", " rb", " rb+" покаж­чик поточної позиції установлюється на початок файлу, а при відкритті в режимах " ab" і " ab+" – на його кінець.

Для введення/виведення даних при роботі з бінарними файлами ви­користовують такі функції:

size_t fread(void *покажчик_на_область_пам’яті, size_t розмір_блоку, size_t кількість, FILE *покажчик_на_потік); – читає з файлу, зв’язаного з потоком, на який указує покажчик_на_потік, кількість блоків даних, кожен з яких має розмір_блоку байт, і записує прочитані дані в область пам’яті, що адресується покажчиком, заданим як перший пара­метр; функція повертає кількість прочитаних блоків при успішному чи­танні або 0 у випадку, коли одразу виявляється кінець файлу або виникає помилка читання;

size_t fwrite(void *покажчик_на_область_пам’яті, size_t розмір_блоку, size_t кількість, FILE *покажчик_на_потік); – пише у файл, зв’язаний з потоком, на який указує покажчик_на_потік, кількість блоків даних, кожен з яких має розмір_блоку байт, читаючи дані з області пам’яті, що адресується покажчиком, заданим як перший параметр; функція по­вертає кількість записаних блоків при успішному записуванні або 0 у випадку помилки записування.

Тип size_t є цілочисловим типом, що в даному випадку еквіва­лентний типу long.

Для позиціонування в потоці можна переміщати покажчик поточної позиції за допомогою наступної функції:

int fseek(FILE * покажчик_на_потік, long зміщення,
int початок_відліку);

При звертанні до цієї функції параметр зміщення задається змінною або виразом типу long і вказує, на скільки байт потрібно змістити покаж­чик поточної позиції у прямому (> 0) або зворотному (< 0) напрямку. Початок_відліку вказує, по відношенню до якої позиції здійснюється зсув покажчика поточної позиції. Він задається однією з трьох констант:

SEEK_SET (== 0) – початок файлу;

SEEK_CUR (== 1) – поточна позиція;

SEEK_END (== 2) – кінець файлу.

Слід пам’ятати, що константа типу long записується у вигляді десяткового значення, слідом за яким додається суфікс L або l (напри­клад, 128L).

Функція fseek() повертає значення 0, якщо переміщення виконано успішно; інакше вона повертає нульове значення:

fseek(f, -1L, SEEK_CUR); – повернутися на 1 байт;

fseek(f, 0L, SEEK_END); – перейти на кінець потоку.

Деякі інші корисні функції:

long ftell(FILE * покажчик_на_потік); – повертає положення покажчика поточної позиції, що вимірюється в байтах від початку файлу, або значення (-1L) при помилці;

int fgetpos(FILE * покажчик_на_потік, fpos_t * позиція); – записує в область пам’яті, що адресується покажчиком позиція, положення покажчика поточної позиції файлу і повертає значення 0 при успішному виконанні або ненульове значення при помилці (тип fpos_t – це цілочисловий тип, що використовується для визначення положення покажчика поточної позиції файлу за допомогою функції fgetpos() або зміщення покажчика поточної позиції файлу функцією fsetpos(); див. нижче);

int fsetpos(FILE * покажчик_на_потік, fpos_t * позиція); – переводить покажчик поточної позиції файлу в позицію, яка зберігається в області пам’яті, що адресується покажчиком позиція, і повертає значен­ня 0 при успішному виконанні або ненульове значення при помилці;

void rewind(FILE * покажчик_на_потік); – переміщає покажчик поточної позиції на початок потоку;

int feof(FILE * покажчик_на_потік); – повертає ненульове зна­чення, якщо перед звертанням до цієї функції було прочитано ознаку кінця файлу, і 0, якщо спроби читання за кінцем файлу не було.

Якщо файл відкритий і для введення, і для виведення (режими " r+" і " a+"), то в разі потреби переходу від введення до виведення (або навпаки) необхідно обов’язково виконати примусове зміщення покажчика поточної позиції файлу (як варіант – на 0 байт відносно поточної позиції).

При роботі з файлами (будь-якими, а не тільки текстовими) корис­ними можуть бути такі дві функції, оголошені в заголовному файлі io.h:

int remove(const char *шлях); – знищення файлу, ім’я якого задане як параметр (файл повинен бути закритим);

int rename(const char *старе_ім’я, const char * нове_ім’я); – перейменування файлу або каталогу (файл повинен бути закритим). Якщо в новому імені файлу вказати інший шлях відносно ста­рого, файл буде перенесений. Каталог перенести неможливо.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.