電子書籍の厳選無料作品が豊富!

Visual Studio 2008(C++)
において↓のようなコードを書いてビルドして、デバッグなしで実行すると、
コンソール上でちゃんとファイルの文字がコンソールに表示されます。

ところで、fgetc()関数のリファレンスを見ると、戻り値がint型を返すと書いてあるのに、
このコードだとchar型のバッファで受けています。char型でもfgetc()
関数の戻り値を受けられる理由がわかりません。
これはやはり、fgetc()がShift-JISコードの文字コード番号そのものを返しているのでしょうか。
(int型の配列で各要素にfgetc()の戻り値をみると、ファイル上の文字の文字コード番号が
入っています。)
char型で受けると、文字そのものを受けられるのでしょうか?

また、char型で受けた時に、char(1バイト)で、EOF(2バイト)をどうやって格納し、識別しているの
でしょうか。

初歩的な質問で申し訳ありませんが、ご回答、よろしくお願いします。

#include <iostream>
using namespace std;

int main(){
FILE *fin = fopen("testa.txt", "r");
if(!fin){
"入力ファイルをオープンできません。";
return 1;
}
int i=0;
char buf[20];
while((buf[i] = fgetc(fin))!=EOF){
i++;
}
buf[i]='\0';
cout << buf << endl;

return 0;
}

A 回答 (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型で受けてはいけません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/10/16 00:00

C において char型は「小さい整数型」として扱われます. だから int の値を char型の変数に代入することも可能です.



ただし, 「EOF を識別する」などという高級な機能はありません. たまたま EOF (の表す値) と一致したらアウトなので, fgetc (とその仲間たち) の返り値を char で受けるのはお勧めしません.
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/10/15 16:36

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