Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



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

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

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

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.



Читайте також:

  1. Автомати­зовані інформаційні систе­ми для техніч­ного аналізу товар­них, фондових та валют­них ринків.
  2. Адвокатура в Україні: основні завдання і функції
  3. Алгоритм знаходження ДДНФ (ДКНФ) для даної булевої функції
  4. Алгоритм однофакторного дисперсійного аналізу за Фішером. Приклад
  5. Але відмінні від значення функції в точці або значення не існує, то точка називається точкою усувного розриву функції .
  6. Аналіз зображувальних засобів. Застосування цілісного аналізу
  7. Аналіз коефіцієнтів цільової функції
  8. Аналіз опрацювання помилок
  9. Аналіз руху грошових коштів у контексті нової фінансової звітності Важливим завданням аналізу фінансового стану підприємства є оцінка руху грошових коштів підприємства.
  10. Аналізу соціальної взаємодії присвячено чимало наукових теорій.
  11. Аналізуюче схрещування
  12. АРХІВНІ ДОВІДНИКИ В СИСТЕМІ НДА: ФУНКЦІЇ ТА СТРУКТУРА




Переглядів: 812

<== попередня сторінка | наступна сторінка ==>
Встановлення поточної позиції файлу | Керування буферизацією даних

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.045 сек.