如何停止从C中的文件读取

时间:2010-01-15 03:58:55

标签: c stdio

我只是想读取文件的每个字符并将其打印出来,但是当文件完成阅读时,但我得到了一堆?完成阅读后。我该如何解决?

#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;
}

7 个答案:

答案 0 :(得分:7)

尽管名称为getc,但int会返回char,而不是EOF,因此它可以表示所有可能的字符值,此外还有getc }(文件结束)。如果char返回char c;,则无法使用文件中可能存在的值之一来指示文件结尾。

因此,要修复代码,必须先将声明int c;更改为EOF,以便在返回时可以保留EOF标记。然后,您还必须更改while循环条件以检查NULL而不是feof(fr)

您也可以调用c来单独测试文件结尾以阅读该字符。如果您这样做了,可以将char作为feof(),但在阅读完字符之后,在打印出来之前,您必须致电break,并使用{{1}离开循环。

答案 1 :(得分:2)

如果不成功,fgetc()会返回EOF。

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

答案 2 :(得分:1)

fgetc()在文件结尾处返回EOF,而不是NULL

答案 3 :(得分:1)

将“NULL”替换为“EOF”。

答案 4 :(得分:1)

更改此

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的比较可能会失败,您将回到开始的位置。

答案 5 :(得分:1)

其他人已经解决了您遇到的问题,但使用printf("%c", c);可能更有效率putchar(c);。当你要求printf只打印一个字符时,会涉及相当多的开销。

答案 6 :(得分:1)

getc 会返回 int

字符c 更改为 int c

getc 返回 EOF , 将针对 NULL 的测试更改为针对 EOF

的测试