重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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;

A 回答 (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の値がそのまま代入されます。

以上、参考になりましたでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

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

お礼日時:2003/05/17 19:59

3.について。



この例だと分かりにくいのですが、一般的に、fgetc()はこういう使われ方をします:

while ((c = fgetc( stream )) != EOF ){
処理
}

EOFは-1で#defineされてます。要するに、fgetcは文字(0から255)とEOF(-1)を返します。
ですので、intでないとダメなんです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

intの必然性が大変よく分かりました。

お礼日時:2003/05/17 19:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!