![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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;
}
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型で受けてはいけません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語について。
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のポインターで詰まっている
-
for文 アスタリスクで形を作る
-
文字列から空白を取り除きたい...
-
C言語プログラミングについて(...
-
文字列がNULLか空文字列かの判定
-
間接操作のレベルとは
-
C言語のfor文です。 繰り返しの...
-
制御の方法
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
strchr() の第2引数はなぜ int ...
-
fgetc()関数の動作について
-
アルファベットの出現頻度求め...
-
'const char *' 型は 'char *' ...
-
コンパイルエラー invalid ope...
-
2曲同時再生するにはどうした...
-
strlen関数と同じ働きをする関...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
テキストデータをそのままバイ...
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
2曲同時再生するにはどうした...
-
C言語の入力した文字を反転させ...
-
配列をnビットシフトする
-
3桁区切(コンマ)記号をつけ...
-
int main()の・・・
-
型変換
-
CStringをwchar_tに変換したい
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
double型の値をchar配列に変換...
-
絶対パスからのファイル名の切...
-
switch文で文字を比較すること...
-
c++ 文字列を入力して、一文字...
おすすめ情報