Файлова система. Файли послідовного доступу

Сайт: Навчально-інформаційний портал НУБіП України
Курс: Програмування (КН). Ч2 ☑️
Книга: Файлова система. Файли послідовного доступу
Надруковано: Гість-користувач
Дата: четвер, 9 квітня 2026, 18:58

1. Модульне програмування. Багатофайлові проєкти

Звичайна С-програма складається із функції main, яка для виконання необхідних дій викликає інші функції. Зв'язок між функціями здійснюється за допомогою передачі параметрів і повернення значень функцій. Але компілятор мови С дозволяє також розбити програму на декілька окремих частин (чи навіть файлів).

При такій структурі функції, що знаходяться в різних файлах можуть використовувати глобальні зовнішні змінні. Всі функції в мові С, за замовчуванням, зовнішні і завжди доступні з будь-яких файлів. Наприклад, якщо програма (проєкт) складається із двох файлів, то функція main може викликати будь-яку з трьох функцій fun1, fun2, fun3, а кожна з цих функцій може викликати будь-яку іншу:

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

Область видимості змінної визначається межами блоку, який у С обмежується фігурними дужками. Існують два основні типи блоків: складений оператор та визначення функції. Внутрішні блоки називають вкладеними, а зовнішні - осяжними.

Час життя змінної може бути локальним (діє тільки під час виконання блоку) або глобальним (існує протягом усього часу виконання програми). Усі функції в мові С мають глобальний час життя.

Область видимості об’єкта - це частина тексту програми, в межах якої цей об’єкт може використовуватися. Якщо змінна оголошена в середині блоку, вона доступна лише в цьому блоці та його вкладених блоках. Якщо ж змінна оголошена поза всіма блоками (на зовнішньому рівні), вона буде видимою у файлі починаючи з місця оголошення й до кінця. За допомогою спеціальних оголошень (наприклад, використання ключового слова extern) об'єкт може бути зроблений доступним в усіх вихідних файлах, що утворюють програму. Таким чином, у мові С видимість і час життя змінних визначаються місцем оголошення та структурою програми.

Приклад:

------------ file1.c ------------
main() {
      …
}

fun1() {
      long int i[];
      …
}

------------ file2.c ------------
long int i[MAX]={0};
fun2(){
        …
}

fun3(){
       …
}

Перше оголошення змінної i[] в наведеному прикладі робить її видимою всередині функції fun1(). Визначення цієї змінної у файлі file2.c робить її видимою у функціях fun2() та fun3().
 
Оголошення функцій
Оголошення функції складається з типу значення, що повертається, імені та списку параметрів. Разом ці три елементи складають прототип. Оголошення може з'явитися у файлі декілька разів.
Оголошення функцій найкраще поміщати в файли із заголовками (хедер-файли, файли з розширенням «h»), які можуть включатися всюди, де необхідно викликати функцію. Таким чином, всі файли використовують одне спільне оголошення. 
 
Включення хедер-файлів
Хедер-файли включаються в текст програми за допомогою директиви препроцесора #include. Директиви препроцесора починаються зі знака «#». 
Програма, яка обробляє ці директиви, називається препроцесором (в сучасних компіляторах препроцесор, зазвичай, є частиною самого компілятора).
Директива #include включає в програму вміст зазначеного файлу. Файл може бути зазначено двома способами:
 
#include <path_specification>
#include " path_specification"
 
Якщо ім'я файлу вказано в кутових дужках (<>), то пошук файла для включення ведеться у наперед визначених місцях (залежить від реалізації).
Якщо ім’я файлу вказано у лапках, то якщо це повне ім’я файлу, то пошук ведеться лише за вказаним шляхом.
Якщо ім’я файла неповне, то пошук починається від каталогу розташування файл, що містить директиву включення.
Якщо такий пошук не вдався, то пошук повторюється так, як для форми із кутовими дужками, тобто у наперед визначених каталогах.
Перелік цих каталогів може бути задано ключем компілятора чи змінною оточення. Хедер-файл також може містити директиви #include.

2. Файли послідовного доступу. Загальна інформація

Для довгострокового збереження великих об'ємів даних використовуються файли.

Більшість комп'ютерних програм працює з файлами. Текстові процесори створюють файли документів. Програми баз даних створюють файли й роблять у них пошук інформації. Компілятори зчитують файли з вихідним кодом і генерують файли, що виконуються. Сам по собі файл - це набір байтів, що зберігаються на деякому пристрої


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

З логічної точки зору (на відміну від фізичної) файл – це група логічно пов'язаних записів. У свою чергу, запис – це група логічно пов'язаних полів даних.

•Існує багато способів організації записів у файлі. Найбільш розповсюджений називається послідовним файлом. У ньому записи зберігаються за порядком, визначеним деяким полем, яке, у свою чергу, називається ключовим полем.
•Мова С розглядає будь-який файл як послідовний потік байтів. Кожний файл закінчується маркером кінця файла. Коли файл відкривається, йому ставиться у відповідність потік. Потоки забезпечують канали передачі даних між файлами і програмами.

На початку виконання програми автоматично відкриваються три файли і пов'язані з ним потоки:

•стандартне введення,
•стандартне виведення, 
•стандартна помилка. 

Стандартний потік введення дозволяє програмі зчитувати дані з клавіатури. Для роботи зі стандартним потоком уведення використовується покажчик файла stdin.

Стандартний потік виведення дозволяє виводити дані на екран дисплея. Для роботи зі стандартним потоком виведення використовується покажчик файла stdout.

 Для роботи зі стандартним потоком помилок використовується покажчик файла stderr.


Відкритий файл повертає покажчик на структуру FILE (визначену в stdio.h). Ця структура містить інформацію, що використовується під час роботи з файлом.

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

Для кожного файла, який використовується в програмі на мові С,  мінімально необхідно виконати три дії:

описати файл,

відкрити файл,

закрити файл.


Кожний файл описується як покажчик на структуру FILE. Наприклад,

FILE *cFptr;

об'являє, що  cFptr є покажчиком на структуру FILE.


Для відкриття файла і присвоєння значення змінній cFptr можна скористатися функцією fopen. Наприклад,

if (cFptr = fopen(“myfile.dat”,”w”)) == NULL)

printf (“Файл не можна відкрити!”);

дозволяє відкрити файл під назвою myfile.dat, зв'язати його з покажчиком cFptr та присвоїти цьому покажчику значення покажчика на структуру FILE.


Другий аргумент функції fopen  – “w” – вказує на режим відкриття файла, а саме на те, що файл повинен відкритися для запису. Якщо файла не існує, він буде створений. Якщо файл уже існує, в режимі “w” вміст файла буде знищений.

 Структура if у програмі використовується для того, щоби визначити значення покажчика cFptr. Якщо воно дорівнює NULL (відкриття файла не відбулося), друкується повідомлення про помилку.


Файли можуть бути відкрити в декількох режимах. Крім режиму “w”, який дозволяє створити файл і записати в нього дані, файл в разі необхідності може бути відкритий у режимі читання, в режимі запису даних у кінець файла, в об'єднаних режимах.

Зрозуміло, що, крім мінімально необхідних трьох операцій з файлом, програма виконує ще певні дії з ним. Якщо файл відкритий для запису, у програмі природно існування операції запису у файл. Це можна зробити за допомогою функції fprintf.

Приклад. 

#include <stdio.h>

#include <conio.h>

int main (void)

{

 float X, Y;

 FILE *fileX;

 clrscr();

 if (( fileX = fopen("fileX.txt","w")) == NULL)

  printf ("Error!");

 else


 {

  printf ("Input data. At the end of the introduction  press <ctrl>+z.\n") ;

  while ( !feof(stdin) )

  {

    printf("X,Y? ");

    scanf("%f %f", &X,&Y);

    if ( !feof(stdin) )

    fprintf(fileX, "%7.2f %7.2f\n",X, Y);

  }

  fclose (fileX);

 }

return 0;

}


3. Створення файла послідовного доступу

Для кожного файла, який використовується в програмі на мові С,  мінімально необхідно виконати три дії:

описати файл,

відкрити файл,

закрити файл.


Кожний файл описується як покажчик на структуру FILE. Наприклад,

FILE *cFptr;

об'являє, що  cFptr є покажчиком на структуру FILE.



Для відкриття файла і присвоєння значення змінній cFptr можна скористатися функцією fopen. Наприклад,

if (cFptr = fopen(“myfile.dat”,”w”)) == NULL)

printf (“Файл не можна відкрити!”);

дозволяє відкрити файл під назвою myfile.dat, зв'язати його з покажчиком cFptr та присвоїти цьому покажчику значення покажчика на структуру FILE.



Другий аргумент функції fopen  – “w” – вказує на режим відкриття файла, а саме на те, що файл повинен відкритися для запису. Якщо файла не існує, він буде створений. Якщо файл уже існує, в режимі “w” вміст файла буде знищений.

 Структура if у програмі використовується для того, щоби визначити значення покажчика cFptr. Якщо воно дорівнює NULL (відкриття файла не відбулося), друкується повідомлення про помилку.



Файли можуть бути відкрити в декількох режимах. Крім режиму “w”, який дозволяє створити файл і записати в нього дані, файл в разі необхідності може бути відкритий у режимі читання, в режимі запису даних у кінець файла, в об'єднаних режимах.




Для закриття файла використовується функція fclose. Наприклад, рядок

fclose(cFptr);

закриває файл, який пов'язаний з покажчиком cFptr (для нашого прикладу - файл myfile.dat).



Зрозуміло, що, крім мінімально необхідних трьох операцій з файлом, програма виконує ще певні дії з ним. Якщо файл відкритий для запису, у програмі природно існування операції запису у файл. Це можна зробити за допомогою функції fprintf.




4. Приклад програми створення послідовного файла

#include <stdio.h>

#include <conio.h>

int main (void)

{

 float X, Y;

 FILE *fileX;

 clrscr();

 if (( fileX = fopen("fileX.txt","w")) == NULL)

  printf ("Error!");

 else


 {

  printf ("Input data. At the end of the introduction  press <ctrl>+z.\n") ;

  while ( !feof(stdin) )

  {

    printf("X,Y? ");

    scanf("%f %f", &X,&Y);

    if ( !feof(stdin) )

    fprintf(fileX, "%7.2f %7.2f\n",X, Y);

  }

  fclose (fileX);

 }

return 0;

}






Програма створює простий файл послідовного доступу, який може використовуватися в програмі аналізу деяких дослідних даних. Для кожного досліду треба ввести два параметри – X i Y. Дані для кожного досліду створюють запис.

За допомогою оператора

fprintf(fileX, "%7.2f %7.2f\n",X, Y);

кожний запис буде записаний у файл fileX.txt. Функція fprintf – це аналог функції printf, за виключенням того, що функція fprintf у якості першого аргументу отримує покажчик файла, в який будуть записані дані.


Рядки
while ( !feof(stdin) )
та
if ( !feof(stdin) )
містять виклик функції feof, щоби визначити, чи встановлений індикатор кінця файла, пов'язаний з потоком stdin.  Індикатор кінця файла встановлюється тоді, коли користувач вводить відповідну комбінацію клавіш. Для комп'ютерів IBM PC та сумісних із ними  – це комбінація клавіш <ctrl> та <z>. Функція feof повертає ненульове значення (true), якщо індикатор кінця файла встановлений. У протилежному випадку ця функція повертає нуль.



5. Читання файла послідовного доступу

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

Для зчитування одного запису з файла використовується функція fscanf, яка аналогічна функції scanf, за виключенням того, що  як перший аргумент вказується покажчик файла, із якого дані зчитуються. Наведемо програму, яка демонструє зразок читання і виведення даних послідовного файла.


#include <stdio.h>

#include <conio.h>

int main (void)

{

 float X, Y;

 FILE *fileX;

 clrscr();

 if (( fileX = fopen("fileX.txt","r")) == NULL)   printf ("Error!");

 else

 {  printf ("   X    *    Y   \n") ;

  printf ("_________________\n") ;

  while ( !feof(fileX) )

  {

    fscanf(fileX,"%f%f", &X, &Y);

    if ( !feof(fileX) )

     printf("%-7.2f * %7.2f \n",X,Y);

  }

  fclose (fileX);

 } getch();

return 0;

}


6. Файли послідовного доступу (відео)


Доступність

Шрифти Шрифти

Розмір шрифта Розмір шрифта

1

Колір тексту Колір тексту

Колір тла Колір тла

Кернінг шрифтів Кернінг шрифтів

Видимість картинок Видимість картинок

Інтервал між літерами Інтервал між літерами

0

Висота рядка Висота рядка

1.2

Виділити посилання Виділити посилання

Вирівнювання тексту Вирівнювання тексту

Ширина абзацу Ширина абзацу

0