
- •Потоки та файли
- •Основи файлової системи
- •Закриття файлу
- •Запис символу: 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 начало_отсчета);
- •Виведення у файловий потік
- •Запис у вихідний файловий потік
- •Читання з вхідного файлового потоку
- •Перевірка помилок при виконання файлових операцій
- •Виконання операцій читання і запису
- •Зауваження та рекомендації
Закриття файлу
Функція fclose() закриває потік, що був відкритий за допомогою виклику fopen(). Функція fclose() записує в файл всі дані, які ще залишалися в дисковому буфері, і проводить, так би мовити, офіційне закриття файлу на рівні операційної системи. Відмова при закритті потоку тягне всілякі неприємності, включаючи втрату даних, зіпсовані файли і можливі періодичні помилки в програмі. Функція fclose() також звільняє блок управління файлом, пов'язаний з цим потоком, даючи можливість використовувати цей блок знову. Так як кількість одночасно відкритих файлів обмежена, то, можливо, доведеться закривати один файл, перш ніж відкривати інший. Прототип функції fclose() такий:
fclose (FILE * pf);
де pf – покажчик файлу, повернутий у результаті виклику fopen(). Повернення нуля означає успішну операцію закриття. У випадку ж помилки повертається EOF. Щоб точно дізнатися, в чому причина цієї помилки, можна використовувати стандартну функцію ferror() (про яку незабаром піде мова). Зазвичай відмова при виконанні fclose() відбувається тільки тоді, коли файл був передчасно видалений (стертий) з дисковода або на диску не залишилося вільного місця.
Запис символу: putc() і fputc()
В системі введення/виведення мови С визначаються дві еквівалентні функції, призначені для виведення символів: putc() і fputc(). (Насправді putc() зазвичай реалізується у вигляді макросу.) Дві ідентичні функції є просто тому, щоб зберігати сумісність зі старими версіями С. Частіше використовується putc(), але застосування fputc() також цілком можливо.
Функція putc() записує символи у файл, який за допомогою fopen() вже відкрито в режимі запису. Прототип цієї функції наступний:
int putc (int ch, FILE * pf);
де pf – це покажчик файлу, повернений функцією fopen(), a ch – виведений символ. Покажчик файлу повідомляє putc(), в який саме файл слід записувати символ. Хоча ch і визначається як int, проте записується тільки молодший байт. Якщо функція putc() виконалася успішно, то повертається записаний символ. В іншому ж випадку повертається EOF.
Читання символу: getc() і fgetc()
Для введення символу також є дві еквівалентні функції: getc() і fgetc().Функція getc() записує символи у файл, який за допомогою fopen() вже відкрито в режимі для читання. Прототип цієї функції наступний:
int getc (FILE * pf);
де pf – це покажчик файлу, що має тип FILE і повернутий функцією fopen(). Функція get() повертає ціле значення, але символ знаходиться в молодшому байті. Якщо не відбулася помилка, то старший байт (байти) буде онулений.
Якщо досягнуто кінець файла, то функція getc() повертає EOF. Тому, щоб прочитати символи до кінця текстового файлу, можна використовувати наступний код:
do { ch = getc (fp); } while (ch! = EOF);
Однак getc() повертає EOF і у разі помилки. Для визначення того, що ж насправді відбулося, можна використовувати ferror().
Використання fopen(), getc(), putc(), і fclose()
Опції fopen(), getc(), putc() і fclose() – це мінімальний набір функцій для операцій з файлами. Наступна програма, KTOD, являє собою простий приклад, в якому використовуються тільки функції putc(), fopen() і fclose(). У цій програмі символи зчитуються з клавіатури і записуються в дисковий файл до тих пір, поки користувач не введе знак долара. Файл визначається в командному рядку. Наприклад, якщо викликати програму KTOD, ввівши в командному рядку KTOD TEST, то рядки тексту будуть вводитися в файл TEST.
/ * програма введення з клавіатури на диск. * / # include <stdio.h> # include <stdlib.h> int main (int argc, char * argv []) { FILE * fp; char ch; if (argc! = 2) { printf ("Ви забули ввести ім'я файлу. \ n"); exit (1); } if ((fp = fopen (argv [1], "w "))== NULL) { printf ("Помилка при відкритті файлу. \ n"); exit (1); } do { ch = getchar (); putc (ch, fp); } while (ch! ='$'); fclose (fp);
return 0; } Наступна програма читає будь-який текстовий файл і виводить його на екран.
# include <stdio.h> # include <stdlib.h> int main (int argc, char * argv []) { FILE * fp; char ch; if (argc! = 2) { printf ("Ви забули ввести ім'я файлу. \ n"); exit (1); } if ((fp = fopen (argv [1], "r "))== NULL) { printf ("Помилка при відкритті файлу. \ n"); exit (1); } ch = getc (fp); / * читання одного символу * / while (ch! = EOF) { putchar (ch); / * виведення на екран * / ch = getc (fp); } fclose (fp); return 0; }