Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lec_11_Pres.doc
Скачиваний:
4
Добавлен:
05.12.2018
Размер:
377.86 Кб
Скачать

7. Функції аналізу помилок

Більшість функцій файлового обміну даними повертають значення, яке дає змогу перевірити, чи дана операція пройшла успішно, чи відбувся збій. Встановити конкретну причину збою можна через функції аналізу помилок файлового введення/виведення.

Зокрема, функція

int feof (FILE* fp);

перевіряє, чи досягнуто кінця файлу, пов'язаного з потоком fp. Повертає нуль, якщо не встановлено ознаку кінця файлу, інакше - ненульове значення. Всі операції читання з файлу після досягнення його кінця вважаються помилковими. Ознаку (індикатор) кінця файлу знімають функції позиціювання fseek (), rewind (), fsetpos () та функція скидання індикаторів помилок clearerr ().

Організовуючи в С-програмах цикли введення даних з файлу, треба пам'ятати, що ознака досягнення кінця встановлюється тільки тоді, коли зчитується код кінця файлу. Раніше вже наводився приклад некоректного використання значення feof () як умови завершення зчитування з файлу числових даних за допомогою функції fscanf (). Неправильною буде також наступна організація циклу введення двійкових кодів послідовності структур, які мають шаблон struct data і зчитуються у буфер buf з потоку fdata:

do {

fread(&buf, sizeof (struct data), 1, fdata);

. . . /* опрацювання введеної структури */

} while ( ! feof(fdata));

Помилка полягає в тому, що остання структура з файлу даних буде опрацьовуватись двічі. Після її введення цикл не завершується, оскільки ще не зчитано код кінця файлу, а тому feof () повертає 0. Наступна операція читання не вводить нових даних, а тільки встановлює ознаку кінця файлу, тому вміст buf не змінюється, а попередньо введена структура опрацьовується другий раз.

Функція

int ferorr (FILE* fp);

перевіряє, чи встановлено ознаку помилки в попередніх операціях звертання до потоків даних. Повертає нуль, якщо помилку не зафіксовано, та ненульове значення, якщо виявлено помилку.

Причину збою в операціях потокового введення/виведення можна розшифрувати, використовуючи функцію

void perorr (char* errtext);

функція виводить у стандартний потік помилок stderr (звичайно це екран) текст повідомлення, записаний в errtext, а за ним після двокрапки стандартне

системне пояснення причини виникнення помилки.

Наведемо приклад аналізу помилок під час роботи з потоком fp:

if (ferorr(fp) )

perorr ( "Збій у роботі з файлом даних" );

Іншим способом розшифрування помилки є звертання до внутрішньої змінної errno, оголошеної в заголовному файлі <errno.h>. У процесі виконання програми в цю змінну автоматично заноситься номер кожної зафіксованої помилки потокового обміну. Щоб отримати текстове пояснення помилки з номером errno, треба скористатись функцією strerror (), оголошеною в <string.h>. У наведеному далі прикладі виконуються такі ж дії, як і в попередньому звертанні до функції perorr(), але додатково виводиться ім'я файлу, для якого зафіксовано помилку:

if (errno) /* errno # 0 - зафіксовано помилку */

fprintf ( stderr, "Збій у роботі з файлом %s - %s \n",

filename, strerror(errno) );

Встановлені індикатори помилок і кінця файлу скидає в нуль функція

void clearerr (FILE* fp);

У наступному фрагменті програми виклик функції clearerr () знімає ознаку кінця файла, щоб доповнити його вміст рядком поточної дати і часу.

FILE *f;

time_t curt; /* змінна для роботи з функціями часу

/* відкриття файла у режимі "r+t" і опрацювання його

if feof(f) { /* опрацьовано весь файл

clearerr(f); /* скидання індикатора помилок

time(&curt); /* визначення поточної дати і часу */

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

fprintf ( f, "\n файл опрацьовано: %s", ctime(&curt) ) ;

}

Для визначення та виведення поточної дати й часу використано функції time () та ctime (), оголошені в заголовному файлі <time. h>.

Перша з них повертає значення, що дорівнює кількості секунд від 1 січня 1970 року, а друга перетворює це значення у стандартний символьний рядок, що включає скорочені найменування дня тижня і місяця, номер дня, час у формі години:хвилини:секунди та поточний рік - ODD MMM dd hh:mm:ss YYYY.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]