- •Елементи мови с.Основні символи
- •Ключові слова
- •Ідентифікатори
- •Константи
- •Лексеми
- •Коментарі
- •Умовні оператори. Логічні вирази
- •Форми оператора if
- •Оператор вибору switch
- •Перерахування типів
- •Перетворення типів
- •Оператори циклу
- •Оператор while
- •Оператор for
- •Оператор do-while
- •Оператори переходу
- •Cтруктури
- •Об'єднання (суміші)
- •Робота з структурами.
- •Ініціалізація структур
- •Робота з обєднаннями
- •Визначення об'єктів та типів
- •Методи доступу до елементів масивів
- •Покажчики на багатовимірні масиви
- •Операції з вказівниками
- •Робота з покажчиками.
- •Покажчики на структуру
- •Масиви структур
- •Динамічне розміщення масивів
- •Робота з динамічними масивами
- •Робота з непрямою адресацією
- •Робота з покажчиками як параметрами функцій
- •Використання вказівників
- •Операції з вказівниками
- •Використання вказівників в програмі
- •Робота з файлами
- •Відкриття файлу
- •Обробка відкритого файлу
- •Перевірка ознаки кінця файлу
- •Закриття файлу
- •Функції введення-виведення
- •Робота з текстовими файлами
- •Функція форматованого виведення printf ()
- •Основні формати
- •Модифікації форматів
- •Функція форматованого введення scanf ()
- •Робота функції scanf ()
- •Призначеня функцій бібліотеки введення-виведення
- •Макрокоманди
- •Потокові інтерфейси введення-виведення
- •Ближні покажчики (near)
- •Дальні покажчики (far)
- •Покажчики huge
- •Функції для роботи з рядками
- •Динамічні рядки, клас string
- •Визначення поточної робочої директорії
- •Визначення поточного каталогу диска
- •Визначення / встановленн поточного диска
- •Пошук файлу
- •Створення, видалення, зміна директорій
- •Приклад програми для роботи з директоріями
- •Перегляд каталогу диска
- •Параметри структури ffblk
- •Робота з клавіатурою
- •Робота з файлами
- •Послідовний доступ до елементів двійкових файлів
- •Організація довільного доступу до елементів двійкових файлів
- •Робота динамічних структур даних.
- •Функції управління пам'яттю
- •Атрибути файлів.
- •Параметри
- •Динамічні структури даніх
- •Лінійні списки
- •Стек. Загальні поняття.
- •Приклад використання стеку
- •Основні визначення
- •Приклад використання дерев
Організація довільного доступу до елементів двійкових файлів
Організація довільного доступу до компонентів файлу дозволяє зчитувати значення з будь-якої позиції в файлі, а також записувати нову інформацію в будь-яке місце у файлі. Але до файлів з довільним доступом пред'являється одна жорстка вимога: їх компоненти повинні мати однакову довжину. Двійкові файли дозволяють забезпечити задоволення цієї вимоги. Про те, щоб дані, які будуть знаходитися у файлі довільного доступу, мали однаковий розмір, слід подбати у момент створення файла.
Ще раз нагадаємо про те, що первинна запис у файл можлива тільки в режимі послідовного доступу.
Для організації довільного доступу до елементів файлу можна здійснити за допомогою функції 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.Функції управління пам'яттю
