Програмування С, С++теорія та практика (частина 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. Можливі значення параметра вдИепсе функції Ізеек
|
Якщо задане значення м>кепсе=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епдЬЬ;
}
12 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
