6

ファイルの各文字を読み取って印刷しようとしていますが、ファイルの読み取りが終了すると、? 読み終わった後。どうすれば修正できますか?

#include <stdio.h>

int main(void){
    FILE *fr;            /* declare the file pointer */

    fr = fopen ("some.txt", "r");  /* open the file for reading */
        /* elapsed.dta is the name of the file */
        /* "rt" means open the file for reading text */
    char c;
    while((c = getc(fr)) != NULL)
    {
        printf("%c", c);
    }
    fclose(fr);  /* close the file prior to exiting the routine */
    /*of main*/ 


    return 0;
}
4

7 に答える 7

7

その名前にもかかわらず、ではなくをgetc返すため、可能なすべての char 値と、さらに(ファイルの終わり) を表すことができます。が返された場合、ファイルに存在する可能性のある値のいずれかを使用せずにファイルの終わりを示す方法はありません。intcharEOFgetcchar

したがって、コードを修正するには、最初に宣言char c;を変更しint c;て、返されたときに EOF マーカーを保持できるようにする必要があります。EOF次に、 while ループ条件を の代わりにチェックするように変更する必要がありますNULL

feof(fr)文字の読み取りとは別に、ファイルの終わりをテストするために呼び出すこともできます。cそれを行った場合、として残すことができますが、文字を読んだ後、それを印刷する前にchar呼び出す必要があり、ループから抜け出すために a を使用する必要があります。feof()break

于 2010-01-15T04:19:21.400 に答える
2

失敗した場合は、 fgetc()EOF を返します。

int c;
while ((c = getc(fr)) != EOF) 
{ 
    printf("%c", c); 
}
于 2010-01-15T04:01:37.193 に答える
2

これを変える

char c;
while((c = getc(fr)) != NULL)
{
    printf("%c", c);
}

char c;
int charAsInt;
while((charAsInt = getc(fr)) != EOF)
{
     c = (char) charAsInt;
     printf("%c", c);
}

EOFつまり、 ではなくと比較する必要がありNULLます。intまた、変数を使用して からの戻り値を受け取る必要がありますfgetc。を使用するcharと、 との比較EOFが失敗する可能性があり、最初の場所に戻ってしまいます。

于 2010-01-15T04:01:40.310 に答える
1

fgetc()EOFではなく、ファイルの終わりで戻りますNULL

于 2010-01-15T04:00:52.840 に答える
1

「NULL」を「EOF」に置き換えます。

于 2010-01-15T04:01:05.390 に答える
1

他の人はあなたが抱えている問題にすでに対処していますが、それを使用するよりも、printf("%c", c);おそらく使用する方がはるかに効率的putchar(c);です. printf1 文字だけを印刷するように要求すると、かなりのオーバーヘッドが発生します。

于 2010-01-15T04:03:36.787 に答える
1

getcはintを返します。

char cint cに変更します。

getcEOFを返します。NULLに対するテストをEOFに対するテストに変更します。

于 2010-01-15T04:06:27.233 に答える