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

Використання 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; }