ストリームの状態
ストリームの有効な状態および状態遷移を、次の図に示します。

円の矢印はそれぞれ安定状態を示しています。 線の矢印はそれぞれストリームを操作する関数呼び出しの結果発生する、遷移を示しています。 5 つの関数グループで、状態遷移が発生する可能性があります。
最初の 3 つのグループの関数は、<stdio.h> で宣言されます。
バイトの読み込み関数 — fgetc、fgets、fread、fscanf、getc、getchar、gets、scanf、および ungetc
バイトの書き込み関数 — fprintf、fputc、fputs、fwrite、printf、putc、putchar、puts、vfprintf、および vprintf
残り 2 つのグループの関数は、<wchar.h> で宣言されます。
ワイド文字の読み込み関数 — fgetwc、fgetws、fwscanf、getwc、getwchar、ungetwc、および wscanf
ワイド文字の書き込み関数 — fwprintf、fputwc、fputws、putwc、putwchar、vfwprintf、vwprintf、および wprintf
この状態の図は、ほとんどの書き込み操作と読み取り操作の間でいずれかの位置関数を呼び出す必要があることを示しています。
ストリームの最後の操作が書き込みであった場合、読み込み関数を呼び出すことはできません。
読み取り操作がファイルの終わり (EOF) インジケーターを設定しない限り、ストリームの最後の操作が読み取りであった場合は、書き込み関数を呼び出すことはできません。
最後に、この状態の図は、位置操作が後に使用できる有効な関数呼び出しの数を減らすことはないことを示しています。