fgetc
EOF
ファイルの終わりまたはエラー状態で戻ります。
それ以外の場合は、読み取られた文字を、unsigned char
に変換されて返しますint
。
とを仮定CHAR_BIT == 16
しsizeof (int) == 1
、次に読み取られる文字の値が0xFFFFであると仮定します。次に、fgetc()
に変換された0xFFFFを返しint
ます。
ここでは少し注意が必要です。0xFFFFは型で表すことができないためint
、変換の結果は実装によって定義されます。ただし、通常、結果は-1になります。これは、の一般的な値(実際、私が今まで聞いた唯一の値)ですEOF
。
したがって、このようなシステムでは、文字の読み取りに成功した場合でもfgetc()
戻ることができます。EOF
ここに矛盾はありません。標準は、ファイルの終わりまたはエラーでfgetc()
返されるままです。EOF
逆は言いません。返されることは、必ずしもエラーまたはファイルの終わりの状態があったことを意味するわけでEOF
はありません。
とfgetc()
を呼び出すことで、実際の文字を読み取るかどうかを決定できます。feof()
ferror()
したがって、このようなシステムは、一般的な入力ループを壊します。
while ((c = fgetc()) != EOF) {
...
}
しかし、それは(必然的に)標準に準拠することに失敗することはありません。
(blagovestによるコメントを参照して)、C99は、標準ライブラリがいつ期待されるか、または準拠する実装が標準ライブラリのすべてではなく一部を実装できるかどうかを指定しますか?
「ホストされた実装」は、を含む標準ライブラリ全体をサポートする必要があり<stdio.h>
ます。
「独立した実装」はサポートする必要はありません<stdio.h>
。<limits.h>
関数( 、、など)を宣言しない標準ヘッダーのみ<stddef.h>
。ただし、独立した実装では、必要<stdio.h>
に応じて提供される場合があります。
通常、自立型の実装は組み込みシステム用であり、多くの場合、オペレーティングシステムはありません。
実際には、私が知っている現在ホストされているすべての実装にはがありCHAR_BIT==8
ます。実際には、ファイルの終わりまたはエラーのいずれかを実際に示した結果を信頼できる可能性がありますが、標準ではそれが保証されていません。EOF
fgetc()