- •Потоки та файли
- •Основи файлової системи
- •Закриття файлу
- •Запис символу: putc() і fputc()
- •Читання символу: getc() і fgetc()
- •Використання fopen(), getc(), putc(), і fclose()
- •Використання feof ()
- •Введення/виведення рядків: fputs () і fgets ()
- •Int fputs (const char * cmp, file * pf); char * fgets (char * cmp, int довжина, file * pf);
- •Функція rewind ()
- •Функція ferror ()
- •Функції fprinf () і fscanf ()
- •Введення-виведення при прямому доступі: функція fseek ()
- •Int fseek (file * pf, long int коліч_байт, int начало_отсчета);
- •Виведення у файловий потік
- •Запис у вихідний файловий потік
- •Читання з вхідного файлового потоку
- •Перевірка помилок при виконання файлових операцій
- •Виконання операцій читання і запису
- •Зауваження та рекомендації
Основи файлової системи
Файлова система мови С складається з декількох взаємопов'язаних функцій. Для їх роботи потрібен заголовок <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, але чому воно точно дорівнює – це має бути написано в документації по компілятору.