Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 1.15.2 Двійкові файли - Програмування С, С++теорія та практика (частина 1) - Studbook

Програмування С, С++теорія та практика (частина 1)

1.15.2 Двійкові файли

Тепер розглянемо роботу з двійковими файлами. Двійковий файл представляє собою просто послідовність символів. Що саме і в якій послідовності зберігається в двійковому файлі - повинна знати програма.

Двійкові файли мають переваги, порівняно з текстовими при зберіганні числових даних. Операції читання і запису з такими файлами виконуються набагато швидше, ніж з текстовими, так як відсутня необхідність форматування (переведення в текстове представлення та навпаки). Двійкові файли зазвичай мають менший розмір, ніж аналогічні текстові файли. В двійкових файлах можна переміщуватися в будь-яку позицію і читати або записувати дані в

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

Про те, як відкривати двійкові файли було згадано раніше. Запис і читання в двійкових файлах виконується відповідно функціями /мгііе і /геасі.

5іге_{ 1тіїе(соп5{ уоіС *рїг, 5іге_{ 5І2е, 5І2е_{ п, РІІ_Е*5{геат);

5Іге_{ 1геаС(уоіС *ріг, 5іге_{ 5іге, 5іге_{ п, РІІ_Е *5Їгеат);

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

#іпс1ийе<з'Ьй±о. Ь>

#іпс1ийе<сопіо.Ь> з'Ьгис'Ь туз'Ьгис'Ь { іп£ і ; сЬаг сЬ;

};

іп£ таіп^оій.)

{

ЕІЬЕ *зїгеат; зїгисї туз'Ьгис'Ь з;

і£ ((з'Ьгеат = ЕорепС'Ьез'Ь.'Ьх'Ь", "мЬ")) == ниьь)

{

£ргіп'Ь£(з'Ьйегг, "Неможливо відкрити файл\п"); ге'Ьигп 1;

}

з.і    = 0; з.сЬ = 'А';

£мгі£е(&з, зігео£(з), 1, зїгеат);

£с1озе(з^геат); ге'Ьигп 0;

}

Тепер розглянемо особливості записування і читання рядків.

сЬаг з[10]; з^гсру(з, "Ехатр1е");

£мгі'Ье(з,з'Ьг1еп(з)+1,зігео£(сЬаг) ,зїгеат) ;

Записування рядків відбувається посимвольно. В даному прикладі число символів, які записуються - іігІеп(і')+1 (одиниця додається на нульовий символ в кінці). Читається рядок аналогічно: £геай(з,з^г1еп(з)+1,зігео£(сЬаг) ,зїгеат) ;

94                                                   Розділ 1. Мова програмування Сі

При цьому читання проходить теж посимвольно.

Дуже часто доводиться працювати з рядками різних довжин. В таких випадках можна перед рядком записати у файл ціле число, яке рівне числу символів у рядку.

іп£ і=з'Ьг1еп(з)+1;

£мгі'Ье(&і,1,зі2ео£(іп'Ь) ,з^геат) ;

£мгі'Ье(з,і,1,з'Ьгеат) ;

£геай(&і,1,зігео£(іп^) ,з^геат) ;

£геай(з,і,1,з'Ьгеат)

В усіх наведених вище прикладах читання даних проходило послідовно. Але, працюючи з двійковими файлами, можна організувати читання даних в довільному порядку. Для цього використовується „покажчик файла” (курсор), який визначає поточну позицію у файлі. При читанні даних курсор автоматично зміщується на число прочитаних байтів. Отримати поточну позицію курсору файла можна за допомогою функції /ґеїї().

Іопд ЇІеІІ(ПІ_Е *5Їгеат);

А встановлюється поточна позиція курсору у файлі за допомогою функції /і'еек():

іп{ Ї5еек(ПІ_Е *5Їгеат, Іопд оЇЇ5е{, іп{ вдИепсе);

Ця функція задає зміщення на число байтів о/реґ від точки відліку, яка визначається параметром м>кепсе. Цей параметр може приймати значення 0, 1, 2 (таблиця 1.14).

Таблиця 1.14. Можливі значення параметра вдИепсе функції Ізеек

Константа

тГвпсв

Точка відліку

ЗЕЕК_ЗЕЇ

0

Початок файлу

ЗЕЕК_0Ш

1

Поточна позиція

ЗЕЕК_ЕШ

2

Кінець файлу

 

Якщо задане значення м>кепсе=1, то о//$еґ може приймати як додатне, так і від’ємне значення, тобто зсув вперед або назад.

Функція тетпй переміщує курсор на початок файлу. уоіС геміпсІ(ПІ_Е *5Їгеат);

Те ж саме можна зробити за допомогою функції/$еек() : £зеек(з^геат, 0Ь, 8ЕЕК_8ЕТ);

Приклад програми, в якій використовуються описані вище функції :

#іпс1ийе <зЬйіо.Ь>

1опд £і1езіге(ЕІЬЕ *зЬгеат); іпЬ таіп(Vоій)

{

ЕІЬЕ *зЬгеат;

зЬгеат = £ореп("ЬезЬ.ЬхЬ", "м+");

£ргіпЬ£(зЬгеат, "ТЬіз із а ЬезЬ");

ргіпЬ£("Розмір файла ЬезЬ.ЬхЬ рівний %1й байт\п", £і1езіге(зЬгеат) ) ;

£с1озе(зЬгеат) ; геЬигп 0;

}

1опд £і1езіге(ЕІЬЕ *зЬгеат)

{

1опд сигроз, 1епдЬЬ; сигроз = £Ье11(зЬгеат);

£зеек(зЬгеат, 0Ь, 8ЕЕК_ЕИБ);

1епдЬЬ = £Ье11(зЬгеат);

£зеек(зЬгеат, сигроз, 8ЕЕК_8ЕТ); геЬигп 1епдЬЬ;

}

 

71