1

C99のセクション7.19.7.1には、次のものがあります。

ストリームが指す入力ストリームのファイルの終わりインジケーターが設定されておらず、次の文字が存在する場合、fgetc関数は、その文字をintに変換されたunsigned charとして取得し、ストリームに関連付けられたファイル位置インジケーターを進めます。 (定義されている場合)。

私が理解したように、intタイプは。と同じ幅を持つことができますunsigned charintこのような場合、fgetcはwidth>CHAR_BITの場合にのみ正しく機能すると結論付けることができますか。

(blagovestによるコメントを参照して)、C99は、標準ライブラリがいつ期待されるか、または準拠する実装が標準ライブラリのすべてではなく一部を実装できるかどうかを指定しますか?

4

2 に答える 2

2

fgetcEOFファイルの終わりまたはエラー状態で戻ります。

それ以外の場合は、読み取られた文字を、unsigned charに変換されて返しますint

とを仮定CHAR_BIT == 16sizeof (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ます。実際には、ファイルの終わりまたはエラーのいずれかを実際に示した結果を信頼できる可能がありますが、標準ではそれが保証されていません。EOFfgetc()

于 2011-11-15T11:01:32.523 に答える
0

はい、そのようなプラットフォームでは、unsigned charと区別できない値が 1 つありますEOF

unsigned charにパディング バイトを含めることは許可されていないため、 の値unsigned charのセットは の可能な値のスーパーセットになりますint

そのようなプラットフォームでの唯一の希望は、少なくともchar署名されているためEOF、正のchar値と衝突しないことです。

このようなプラットフォームが抱える問題は、おそらくこれだけではありません。

于 2011-11-15T09:36:42.533 に答える