2017-04-02 2 views
0

CODE#1:Cプログラミングにおけるファイル処理:以下の2つのコードの違いは何ですか?

#include<stdio.h> 
void main() 
{ 
    FILE *fp; 
    char ch; 
    fp=fopen("1.txt","r"); 
    while((ch=fgetc(fp))!=EOF) 
    { 
     printf("%c",ch); 
    } 
    fclose(fp); 

} 

コード#2: CODE#2でそれが整数データ型の下に宣言している間

#include<stdio.h> 
void main() 
{ 
    FILE *fp; 
    int ch; 
    fp=fopen("1.txt","r"); 
    while((ch=fgetc(fp))!=EOF) 
    { 
     printf("%c",ch); 
    } 
    fclose(fp); 

} 

ここCODE#1変数CHでは、文字データ型の下で宣言され、私の質問は、どのように両方のコードの出力が同じになるのですか?文字(CODE#1のch変数に格納されている)と整数値(EOFが返す)をどのように比較できますか?整数値はどのようにして(intergerデータ型の)ch変数に格納され、CODE#2に出力されますか?

+3

このプログラムは、16進数「0xFF」という文字を含むファイルで実行します。突然両方のコードの出力が同じではありません。 –

+0

は0xFFで1.txtファイルを保存し、上記のCODE#1とCODE#2を使用して同じ出力を得ています。あなたの答えを教えてくださいできますか? – Vinu

答えて

2

コード#1は明らかに間違っており、プログラマによってよく行われる間違いです。 fgetcは、値をEOFと比較できるようにintを正確に返します。

EOFは整数の定数値に展開され、実装に依存する負の値ですが、最も一般的には-1になります。したがって、fgetcの戻り値がcharに代入されると、有効なchar値である255に切り捨てられます。これは、fgetcがintの戻り値型を持ち、fgetcから返された値が決してcharに代入されてはならない理由です。

整数値はどのように(変数データ型の)ch変数に格納され、CODE#2で出力されますか?

はfgetc関数のmanページには、明確に()

のfgetcを述べストリームから次の文字を読み取り、ファイルやエラーの終わりにunsigned char型のint型へのキャスト、またはEOFとして返します。

したがって、返される値がEOFでない限り、それを印刷するためにcharへの型キャストは問題ありません。

+0

CODE#2では、(int型のデータ型で宣言された)ch変数は、文字を1txtファイルのfgetc関数から取得し、%cを使ってそれを出力する方法を教えてください。 – Vinu

関連する問題