3.2.1          Поняття потоку введення-виведення. Обробка помилок і визначення стану файлу.

Функції потокового файлового введення-виведення включені в стандарт ANSI мови Сі, і тому їх часто називають функціями стандартного введення-виведення. Для кожного файлу, відкритого для доступу через потік введення-виведення, Turbo C створює внутрішню структурну змінну по шаблону FILE, визначену в <stdio.h> так:

typedef struct{
   short level;                 /* прапор стану ‑ буфер порожній (повний) */
   unsigned flags;           /* прапор стану файла */
   char fd;                      /* префікс файлу */
   unsigned char hold;   /* непереданий символ */
   short bsize;                /*розмір внутрішнього буферу */
   unsigned char *buffer;     /* значення покажчика для доступу  всередині буферу: задає початок буферу, початок рядка або поточне значення покажчика всередині буферу в залежності від режиму буферизації. */
   unsigned char *curp; /* поточне значення покажчика для доступу всередині буферу: задає поточну позицію в буфері для обміну з програмою. */
   unsigned istemp;        /* прапор тимчасового файлу */
   short token;                /* маркер дійсності файлу */
} FILE;

Прапори стану файлу приймають одне з наступних можливих значень, що задаються символьними константами, описаними в файлі <stdio.h>:

_F_RDWR

файл відкритий для читання і запису

_F_READ

файл відкритий тільки для читання (Read Only File)

_F_WRIT

файл відкритий тільки для запису (Write Only File)

_F_BUF

файл має виділений динамічні буфер даних

_F_LBUF

файл що буферизується рядками

_F_ERR

індикатор наявності помилки при виконанні файлового доступу

_F_EOF

індикатор виникнення умови кінця файлу (EOF)

_F_BIN

признак відкриття файлу в бінарному режимі

_F_IN

здійснюється читання (введення) даних з файлу

_F_OUT

здійснюється запис (виведення) даних в файл

_F_TERM

Файл є терміналом.

Наведені значення задають бітову позицію в полі flags, і їх слід використовувати як маску для операції порозрядного &. Наприклад, якщо необхідно виконати розгалуження в залежності від того, є файл відкритим тільки для читання (припускається, що файл успішно відкритий і на його опис по шаблону FILE посилається покажчик ptr), то у програму поміщають наступний фрагмент:

if( ptr -> flags & _F_READ )
   /*Дії, якщо файл відкритий тільки для читання. */
else
    /*У протилежному випадку */

Для використанні безпосереднього доступу до опису файлу як потоку побудовані макро feof(), ferror() та fileno(), визначені у <stdio.h>:

#define ferror( f )             ( ( f ) -> flags & _F_ERR )
#define feof( f )                 ( ( f ) -> flags & _F_EOF )
#define fileno( f )              ( ( f ) -> fd )

Макро feof( f ) поповертає не рівне нулю число, якщо при доступі до файлу, на опис якого вказує f, досягнутий кінець файлу; у протилежному випадку макро поповертає нуль.

Макро ferror( f ) повертає не рівне нулю число, якщо при доступі до потоку, на опис якого вказує f, виникає помилка. У протилежному випадку макро повертає нуль. Для того щоб перераховані макро повертали саму свіжу інформацію, необхідно виконувати очистку поля flags зверненням до функції clearerror( FILE *fp ):

#include <stdio.h>
void clearerror( FILE *fp )

Скидає біт індикації кінця файлу і виникнення помилки для відкритого потоку, на опис якого вказує fp.

Макро fileno( f ) повертає префікс файлу, зв’язаний з відкритим потоком введення-виведення.