Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Samostoyatelnye_po_S.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
671.74 Кб
Скачать

Організація довільного доступу до елементів двійкових файлів

Організація довільного доступу до компонентів файлу дозволяє зчитувати значення з будь-якої позиції в файлі, а також записувати нову інформацію в будь-яке місце у файлі. Але до файлів з довільним доступом пред'являється одна жорстка вимога: їх компоненти повинні мати однакову довжину. Двійкові файли дозволяють забезпечити задоволення цієї вимоги. Про те, щоб дані, які будуть знаходитися у файлі довільного доступу, мали однаковий розмір, слід подбати у момент створення файла.

Ще раз нагадаємо про те, що первинна запис у файл можлива тільки в режимі послідовного доступу.

Для організації довільного доступу до елементів файлу можна здійснити за допомогою функції fseek (), прототип якої описаний в заголовному файлі stdio.h. Синтаксичне опис функції:

int fseek (FILE * stream, long offset, int whence);

Функція fseek () переміщає внутрішній покажчик файлового потоку, змінюючи місце у файлі, з якого починається наступна операція читання або запису. У разі успішного завершення функція повертає 0, в разі помилки-ненульове значення.

Параметри функції:

FILE * stream - yказатель на відкритий файловий потік, аналогічної повертається функцією fopen ();

long offset - число байтів, на яке потрібно перемістити файловий покажчик у напрямку, вказаному параметром whence. Для переміщення файлового покажчика у зворотному напрямку (в бік початку файлу), слід встановлювати отто рівним від'ємному значенню;

int whence - вказує положення точки відліку файлового покажчика, від якої відбуватиметься його переміщення. Значення аргументу whence представлені нижче.

Значення аргументу whence

Значення Опис

SEEK_SET Переміщення файлового покажчика відбувається відносно початку файлу

SEEK_END Переміщення файлового покажчика відбувається відносно кінця файлу

SEEK_CUR Переміщення файлового покажчика відбувається відносно поточної позиції файлового покажчика

При використанні функції fseek () слід дотримуватися обережності, так як через обмеження DOS потрапляння за межі файлу найчастіше не приводить до генерації помилки, тому програмісту самому слід вживати заходів для запобігання звернення до диска за межами відомих кордонів файлу.

При організації довільного доступу використовується функція ftell (), що здійснює навігацію всередині файлу. Прототип функції описаний в stdio.h. Ця функція повертає внутрішній покажчик файлового потоку, рівний зсуву в байтах від початку двійкового файлу до байта, з якого починається наступна операція введення / виводу. Це значення можна передати функції fseek (), або використовувати будь-яким іншим чином.

Синтаксичне опис функції:

long int ftell (FILE * stream).

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

Наступні оператори демонструють можливості функції fseek ():

fseek (f, sizeof (t), SEEK_CUR); - переміщує файловий вказівник з поточної позиції на наступну;

fseek (f,-sizeof (t), SEEK_CUR); - на попередню позицію;

fseek (f, 0, SEEK_END); - на кінець файлу.

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

Приклад. Записати нуль на місце мінімального значення у файлі Test.dat.

# Include <stdio.h>

# Include <stdlib.h>

# Include <io.h>

int main ()

{FILE * f_test;

int i_min; / / номер мінімального елемента

int handle; / / дескриптор файлу

int value, min;

f_test = fopen ("Test.dat", "r + b");

if (! F_test) {puts ("Не можна відкрити файл! \ n");

exit (1);

}

handle = fileno (f_test); / / перетворити відкритий файловий

/ / Потік в дескриптор файлу

fread (& min, sizeof (int), 1, f_test);

i_min = 0;

for (int i = 0; i <filelength (handle); i + +)

{Fread (& value, sizeof (int), 1, f_test);

if (value <min) {min = value;

i_min = i;

}

}

fseek (f_test, i_min * sizeof (int), SEEK_SET);

fwrite (& zero, sizeof (int), 1, f_test);

fclose (f_test);

return 0;

}

Функція filelength (f_inp) в якості аргументу приймає дескриптор файлу, відкритого функцією fopen (), і повертає розмір цього файлу. Для отримання дескриптора, використовуваного для ідентифікації файлу, служить функція перетворення файлового відтоку в дескриптор fileno (). Аргументом функції fileno (FILE * stream) є файловий потік. Негативне значення дескриптора служить ознакою помилки.

Зауважимо, що, як і в масивах, перший елемент, що знаходиться у файлі, має номер 0, другий - 1 і т.д.

Для визначення кінця файлового потоку використовується функція feof (), прототип якої описаний в заголовному файлі stdio.h. Функція повертає істину (1), якщо внутрішній покажчик заданого файлового потоку знаходиться за останнім байтом файлу і брехня (0), якщо внутрішній покажчик файлу знаходиться не в кінці файлу.

Питання для контролю:

1.Як здійснюється обробка двійкових файлів?

2. Як здійснюється послідовний доступ до елементів двійкових файлів?

3.Як здійснюється організація довільного доступу до елементів двійкових файлів?

Література:

1. Т.Сван, “ Освоение BORLAND C++ 4.5 Практический курс”, Киев, “Диалектика”, 1996 г.- с. 270-272

Урок №62

(згідно робочої навчальної програми)

Тема:Динамічні структури даних

Питання:

1.Робота динамічних структур даних.

2.Функції управління пам'яттю

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]