• ベストアンサー

int型のchar型への代入について

VC++6.0のfgetcのヘルプに以下のようなコードが有りました。 int型のchをcharのbuffer[i]に代入するということに違和感を感じたのですが、 1.このようにする必要性とは何なのでしょうか? 2.このような代入により具体的には何が行われているのでしょうか? 3.そもそも1文字とりだすfgetcの戻り値がcharでなくintなのはなぜ? 質問が漠然としていて申し訳ありませんが、お願いします。  FILE *stream; char buffer[81]; int ch; 省略   stream = fopen( "fgetc.c", "r" )) 省略 ch = fgetc( stream ); 省略 buffer[i] = ch;

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

  • ベストアンサー
  • layer13
  • ベストアンサー率47% (37/78)
回答No.2

順序的には3番から考えた方が良いですね。 というわけで3番から。 >3.そもそも1文字とりだすfgetcの戻り値がcharでなくintなのはなぜ? ヘルプをごらんになるとわかると思いますが、fgetc()は 次の文字を返すという記述があり、ファイルの終端または エラーが発生した場合EOFを返すとなっています。 ここで、もしfgetc()がcharを返す関数だった場合を考えてみます。 そうすると、通常は0から255までが文字コードとして使えることを 想定しているcharではEOFを表現することができなくなってしまいます。 エラー発生などを知る必要がなければそれでも良いのかもしれませんが、 ほとんどの人は困ると思います。 何よりファイルの終わりが検出できませんし… というわけで、charよりも大きな値を扱える型を採用することで EOFを表現可能としています。 なお、「それだったらshortでもいいじゃない?」と思われるかもしれませんが intは一番CPUが扱いやすいサイズであることがほとんどなので、 効率を考えるとintということになったと考えられます。 さて、残りの1番と2番についてですが、 >1.このようにする必要性とは何なのでしょうか? fgetc()の戻りがintなので、intで受ける習慣をつけておこう。 という、半ばセオリーですね。 chをcharとしてしまうと if(char!=EOF) なんていう判定ができなくなってしまいますので、当然といえば当然ですが。 >2.このような代入により具体的には何が行われているのでしょうか? fgetc()が正常に終了したのであれば、chに入る値は0~255の範囲です。 これは、特別な変換を行わなくてもcharで表現できる値の範囲内なので、 bufferにはchの値がそのまま代入されます。 以上、参考になりましたでしょうか?

mk1234
質問者

お礼

回答ありがとうございました。 不明確な質問にも関わらず、質問の意図をしっかりと理解いただいた回答でたいへんよく分かりました。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

3.について。 この例だと分かりにくいのですが、一般的に、fgetc()はこういう使われ方をします: while ((c = fgetc( stream )) != EOF ){ 処理 } EOFは-1で#defineされてます。要するに、fgetcは文字(0から255)とEOF(-1)を返します。 ですので、intでないとダメなんです。

mk1234
質問者

お礼

回答ありがとうございました。 intの必然性が大変よく分かりました。

関連するQ&A