Состояния потока
Допустимые состояния и переходы состояний для потока показаны на следующем рисунке.
Каждый из кругов обозначает устойчивое состояние. Каждая из линий задает переход, который может возникать в результате вызова функции, которая работает в потоке. Пять групп функций могут вызвать переходы состояний.
Функции в первых трех группах объявлены в <stdio.h>:
Функции чтения байтов — fgetc, fgets, fread, fscanf, getc, getchar, gets, scanf, and ungetc
Функции записи байтов — fprintf, fputc, fputs, fwrite, printf, putc, putchar, puts, vfprintf, and vprintf
Функции позиционирования — fflush, fseek, fsetpos, and rewind
Функции в оставшихся двух группах объявлены в <wchar.h>:
Функции чтения расширенных символов — fgetwc, fgetws, fwscanf, getwc, getwchar, ungetwc, and wscanf,
Функции записи расширенных символов — fwprintf, fputwc, fputws, putwc, putwchar, vfwprintf, vwprintf, and wprintf,
Схема состояний показывает, что необходимо вызвать одну из функций позиционирования между большинством операций записи и чтения:
Невозможно вызвать функцию чтения, если последняя операция в потоке была операцией записи.
Невозможно вызвать функцию записи, если последняя операция в потоке была операцией чтения, если только операция чтения не установила индикатор конца файла.
Наконец, схема состояний показывает, что операция позиционирования никогда не уменьшает число допустимых вызовов функций, которые могут следовать далее.