- •Потоки та файли
- •Основи файлової системи
- •Закриття файлу
- •Запис символу: 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 начало_отсчета);
- •Виведення у файловий потік
- •Запис у вихідний файловий потік
- •Читання з вхідного файлового потоку
- •Перевірка помилок при виконання файлових операцій
- •Виконання операцій читання і запису
- •Зауваження та рекомендації
Використання feof ()
Як уже говорилося, якщо досягнуто кінець файла, то getc() повертає EOF. Однак перевірка значення, повернутого getc(), можливо, не є найкращим способом дізнатися, чи досягнуто кінець файлу.
По-перше, файлова система мови С може працювати як з текстовими, так і з двійковими файлами. Коли файл відкривається для двійкового введення, то може бути прочитане ціле значення, яке, як з'ясується під час перевірки, дорівнює EOF. В такому випадку програма введення повідомить про те, що досягнуто кінця файлу, чого насправді може й не бути.
По-друге, функція getc() повертає EOF і у випадку відмови, а не тільки тоді, коли досягнуто кінець файлу. Якщо використовувати тільки повернуте значення getc(), то неможливо визначити, що ж насправді сталося. Для вирішення цієї проблеми в С є функція feof(), яка визначає, чи досягнуто кінець файлу. Прототип функції feof:
int feof (FILE * pf);
Якщо досягнуто кінець файлу, то feof() повертає true (істина); в іншому ж випадку ця функція повертає нуль. Тому наступний код буде читати двійковий файл до тих пір, поки не буде досягнутий кінець файлу:
while (! feof (fp)) ch = getc (fp);
Ясно, що цей метод можна застосовувати як до двійкових, так і до текстових файлів. У наступній програмі, яка копіює текстові або двійкові файли, є приклад застосування feof(). Файли відкриваються в двійковому режимі, а потім feof () перевіряє, чи не чи досягнутий кінець файлу.
/* Копіювання файлу. */ # include <stdio.h> # include <stdlib.h> int main (int argc, char * argv []) { FILE * in, * out; char ch; if (argc! = 3) { printf ("Ви забули ввести ім'я файлу. \ n"); exit (1); } if ((in = fopen (argv [1], "rb "))== NULL) { printf ("Не можна відкрити вихідний файл. \ n"); exit (1); } if ((out = fopen (argv [2], "wb")) == NULL) { printf ("Не можна відкрити файл результатів. \ n"); exit (1); } / * Саме цей код копіює файл. * / while (! feof (in)) { ch = getc (in); if (! feof (in)) putc (ch, out); } fclose (in); fclose (out); return 0; }
Введення/виведення рядків: fputs () і fgets ()
Крім getc() і putc(), у мові С також підтримуються родинні їм функції fgets() і fputs(). Перша з них читає рядки символів з файлу на диску, а друга записує рядки такого ж типу в файл, теж знаходиться на диску. Ці функції працюють майже як putc() і getc(), але читають і записують не один символ, а цілий рядок. Прототипи функцій fgets() і fputs() наступні:
Int fputs (const char * cmp, file * pf); char * fgets (char * cmp, int довжина, file * pf);
Функція fputs() пише в певний потік рядок, на який вказує cmp. У випадку помилки ця функція повертає EOF.
Функція fgets () читає з певного потоку рядок, і робить це до тих пір, поки не буде прочитано символ нового рядка або кількість прочитаних символів не стане рівним довжині -1. Якщо був прочитаний розділювач рядків, він записується в рядок, чим функція fgets() відрізняється від функції gets(). Отриманий в результаті рядок буде закінчуватися символом кінця рядка ("\0"). При успішному завершенні роботи функція повертає cmp, а в разі помилки – порожній покажчик (null).
У наступній програмі показано використання функції fputs(). Вона читає рядки з клавіатури і записує їх у файл, який називається TEST. Щоб завершити виконання програми, введіть пустий рядок. Оскільки функція gets () не записує розділювач рядків, то його доводиться спеціально вставляти перед кожним рядком, записуваної в файл; це робиться для того, щоб файл було легше читати:
# include <stdio.h> # include <stdlib.h> # include <string.h> int main (void) { char str [80]; FILE * fp; if ((fp = fopen ("TEST", "w "))== NULL) { printf ("Помилка при відкритті файлу. \ n"); exit (1); } do { printf ("Введіть рядок (порожню – для виходу): \ n"); gets (str); strcat (str, "\n"); / * додавання роздільника рядків * / fputs (str, fp); } while (* str! = '\n'); return 0; }