Функції потокового файлового введення-виведення включені в стандарт 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 ) повертає префікс файлу, зв’язаний з відкритим потоком введення-виведення.
![]() |
![]() |
![]() |