• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:fgetc()関数の動作について)

fgetc()関数の動作について

このQ&Aのポイント
  • Visual Studio 2008(C++)において、fgetc()関数を使用する際の戻り値の型について疑問があります。
  • char型のバッファでfgetc()関数の戻り値を受けることができる理由やShift-JISコードの文字コード番号についても知りたいです。
  • また、char型でEOF(End of File)を格納して識別する方法についても教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

>char型でもfgetc() 関数の戻り値を受けられる理由がわかりません。 char型は int型の一種です。長さが文字一文字分の整数型です。多くの場合8bit。 fgetc()の返すのは1文字もしくはEOFなので、格納できます。 >また、char型で受けた時に、char(1バイト)で、EOF(2バイト)をどうやって格納し、識別しているの でしょうか。 EOFは(かならずしも)2バイトではありません。値が -1 の int型定数です。多くの場合32bit。 char型が8ビットの場合、signed char は -128~+127の数値を扱えます。fgetc()がEOFの時は、-1 を返すので、signed char型変数に -1 が代入され、それと EOFつまり -1 を比較しているので一致します。 ファイルの途中に、0xFF というデータがあった場合、fgetc()は255というintデータを返しますが、signed char型変数にはそのまま255つまり0xFFが代入され、これはsigned char型では -1 と見なされるので、EOF と等しくなってしまいます。つまりそれ以降のデータが読めません。 「入力するファイルには将来にわたっても絶対に0xFFというデータは入っていない。入っていたら腹を切る」という場合には、fgetc() を signed char 型で受けてもかまいません。腹を切るのがいやな場合は、int型変数で受けます。 signed char とも unsigned char とも書かずに単に char と書いた場合にどちらになるかは処理系依存だったはずですので、単なる char型だと処理系によってはunsignedなので 0xFF は +255 になり、EOFと一致することは無くなります。なので、「特定のコンパイラだけで動けば良い。移植は許さない」という場合を除いて、上述のように腹を切る覚悟があってもchar型で受けてはいけません。

beterugius
質問者

お礼

詳しい長文を書いていただき、大変ためになりました。 どうも有難うございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

C において char型は「小さい整数型」として扱われます. だから int の値を char型の変数に代入することも可能です. ただし, 「EOF を識別する」などという高級な機能はありません. たまたま EOF (の表す値) と一致したらアウトなので, fgetc (とその仲間たち) の返り値を char で受けるのはお勧めしません.

beterugius
質問者

お礼

どうも有難うございました。

すると、全ての回答が全文表示されます。

関連するQ&A