Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 9 (Файли).docx
Скачиваний:
29
Добавлен:
16.05.2015
Размер:
64.85 Кб
Скачать

Основи файлової системи

Файлова система мови С складається з декількох взаємопов'язаних функцій. Для їх роботи потрібен заголовок <stdio.h>. Часто використовувані функції файлової системи С такі:

Назва

Що робить

fopen()

Відкриває файл

fclose()

Закриває файл

putc()

Записує символ у файл

fputc()

Те саме, що і putc()

getc()

Читаетє символ з файлу

fgetc()

Те саме, що і getc()

fgets()

Читає рядок з файлу

fputs()

Записує рядок у файл

fseek()

Встановлює покажчик поточної позиції на певний байт файлу

ftell()

Повертає поточне значення покажчина у файлі

fprintf()

Для файлу те саме, що printf() для консолі

fscanf()

Для файлу те саме, що scanf() для консолі

feof()

Повертає значення true (істина), якщо досягнуто кінець файлу

ferror()

Повертає значення true, якщо виникла помилка

rewind()

Встановлює покажчик поточної позиції на початок файлу

remove()

Знищуєт файл

fflush()

Дозапис потоку у файл

Заголовок <stdio.h> надає прототипи функцій введення/виведення і визначає наступні три типи: size_t, fpos_t і FILE. size_t і fpos_t представляють собою певні різновиди такого типу, як ціле без знака. А про третій тип, FILE, розповідається в наступному розділі.

Крім того, в <stdio.h> визначається декілька макросів. З них до матеріалу цієї глави відносяться NULL, EOF, FOPEN_MAX, SEEK_SET, SEEK_CUR і SEEK_END. Макрос NULL визначає порожній (null) покажчик. Макрос EOF, часто визначається як -1, є значенням, що повертається тоді, коли функція введення намагається виконати читання після кінця файлу. FOPEN_MAX визначає ціле значення, рівне максимальному числу одночасно відкритих файлів. Інші макроси використовуються разом з fseek() – функцією, що виконує операції прямого доступу до файлу.

Покажчик файлу

Це те, що поєднує в єдине ціле всю систему введення/виведення мови С. Покажчик файлу – це покажчик на структуру типу FILE, яка містить різноманітні відомості про файл, наприклад, його ім'я, статус і покажчик поточної позиції в початок файлу. По суті, покажчик файлу визначає конкретний файл і використовується відповідним потоком при виконанні функцій введення/виведення. Щоб виконувати в файлах операції читання і запису, програми повинні використовувати покажчики відповідних файлів. Щоб оголосити змінну-покажчик файлу, пишуть:

FILE * fp;

Відкриття файлу

Функція fopen() відкриває потік і пов'язує з цим потоком певний файл. Потім вона повертає покажчик цього файлу. Найчастіше під файлом розуміють дисковий файл. Прототип функції fopen() такий:

FILE * fopen (const char * ім'я_файлу, const char * режим);

де ім'я_файлу – це покажчик на рядок символів, що представляє собою припустиме ім'я файлу, в який також може входити специфікація шляху до цього файлу. Рядок, на яку вказує режим, визначає, яким чином файл буде відкритий. У табл. показано, які значення рядка "режим" є допустимими. Рядки, подібні "r+b" можуть бути представлені і у вигляді "rb+".

Допустимые значения режим

Режим

Що означает

r

Відкрити текстовий файл для читення

w

Створити текстовий файл для запису

a

Додати в конец текстового файла. Якщо файл не існує, то він просто буде створений. Всі нові дані, які записуються в нього, будуть додаватися в кінець файлу.

rb

Відкрити двійковий файл для читання

wb

Створити двійковий файл для запису

ab

Додати в конец двійкового файла

r+

Відкрити текстовий файл читання/запису. Вміст залишиться недоторканим. Якщо файл не існує, то створений не буде.

w+

Створити текстовий файл для читання /запису. Якщо файл не існує, то він буде створений. Якщо файл вже існує, то відкриття призведе до втрати його вмісту, а в режимі r+ він залишиться недоторканим

a+

Добавить в конец текстового файла або створити текстовий файл для читання/запису

r+b

Відкрити двійковий файл для читання /запису

w+b

Створити двійковий файл для читання /запису

a+b

Додати в кінець двійкового файла или створити двійковий файл для читання /запису

Як уже згадувалося, функція fopen() повертає покажчик файла. Ніколи не слід змінювати значення цього покажчика в програмі. Якщо при відкритті файлу відбувається помилка, то fopen() повертає порожній (null) покажчик. У наступному коді функція fopen() використовується для відкриття файлу на ім'я TEST для запису.

FILE * fp; fp = fopen ("test", "w");

Хоча попередній код технічно правильний, але його зазвичай пишуть по-іншому:

FILE * fp; if ((fp = fopen ("test", "w "))== NULL)

{  printf ("Помилка при відкритті файлу. \ n");    exit(1); }

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

Хоча назва більшості файлових режимів пояснює їх зміст, проте не завадить зробити деякі доповнення. Якщо спробувати відкрити файл лише для читання, а він не існує, то робота fopen() завершиться відмовою. А якщо спробувати відкрити файл у режимі дозапису, а сам цей файл не існує, то він просто буде створений. Більш того, якщо файл відкрито в режимі дозапису, то всі нові дані, які записуються в нього, будуть додаватися в кінець файлу. Вміст файлу до відкриття (якщо тільки він був), змінено не буде. Далі, якщо файл відкривають для запису, але з'ясовується, що він не існує, то він буде створений. А якщо він існує, то вміст буде втрачено, причому буде створений новий файл. Різниця між режимами r+ і w+ полягає в тому, що якщо файл не існує, то в режимі відкриття r+ він створений не буде, а в режимі w+ все відбудеться навпаки: файл буде створений! Більш того, якщо файл вже існує, то відкриття його в режимі w+ призведе до втрати його вмісту, а в режимі r+ він залишиться недоторканим.

З табл. видно, що файл можна відкрити або в одному з текстових, або в одному з двійкових режимів. У більшості реалізацій в текстових режимах кожна комбінація кодів повернення каретки (ASCII 13) і кінця рядка (ASCII 10) перетвориться при введенні в символ нового рядка. При виведенні ж відбувається зворотний процес: символи нового рядка перетворюються в комбінацію кодів повернення каретки (ASCII 13) і кінця рядка (ASCII 10). У двійкових режимах такі перетворення не виконуються. Максимальне число одночасно відкритих файлів визначається FOPEN_MAX. Це значення не менше 8, але чому воно точно дорівнює – це має бути написано в документації по компілятору.