2016-09-02 10 views
0

fgetcは、一度にファイルから文字を読み取り、その文字をタイプとしてintとして返します。ファイルが終了すると、fgetcEOF(おそらく "(int)(-1)")を返します。しかし、私はそう頻繁にこれを見てきました:fgetcが0xFFを読み込むとどうなりますか?

char ch; 

while ((ch = fgetc(fp)) != EOF) { /* Do something. */ } 
     |<-- PARN -->| 

これは私が心配です:

  1. fgetcOxFFを読み取り、0x000000FFを返します。
  2. 0xFFchに割り当てられます。 PARNcharのタイプである
  3. 場合(intからcharにキャストする型が)、それは0xFFFFFFFFに昇格されます。
  4. PARN == EOFが原因でwhileループが中断します。 (ファイルからの読み取りを停止する)

OxFFを読んでEOFを返す方法を教えてください。それはunsigned char、又はEOFの値のいずれかを返すことができるので、fgetcの戻り型がintある

+1

これは、 'ch'が' char'ではなく 'int'型であると宣言した理由です。 –

+0

コードが爆発します。 –

+1

ほとんどの場合、人々は 'ch'を' char'と宣言します。 –

答えて

3

全体の理由があります。これは、仕様書やCの学習に役立つ資料にはっきりと記載されています。タイプcharのオブジェクトを使用して結果を格納すると、プログラマのエラーです。

+0

私はそれを得た。私は他の[スレッド](http://stackoverflow.com/questions/30213308/file-pointers-behave-differently-whe-passed-to-functions-why)でそのようなコードを見たとき、私は間違っていると思った私はここで尋ね、それが正しいかどうかをチェックする。どうもありがとう。 ;-) –

1

はい、比較が行われる前に値がcharに型キャストされるのは間違いありません。

最も簡単な解決策は以下のとおりです。

int chread; 
while ((chread = fgetc(fp)) != EOF) { char ch = chread; /* Do something. */ } 
+0

解決に感謝します。 ;-) –

0

fgetc()は、成功または失敗した場合にEOFで取得した文字を返します。

ファイルの終わりの状態が原因で障害が発生した場合は、eofインジケータ(feof()参照)をストリームに追加設定します。他のエラーによってエラーが発生した場合は、エラーインジケータ(ferror()を参照)をストリームに設定します。

関連する問題