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返回一个int,而不是一个char,所以它可以表示所有可能的 char 值,此外,EOF(文件结束)。如果getc返回 a char,则如果不使用文件中可能存在的值之一,就无法指示文件结束。

因此,要修复您的代码,您必须首先将声明更改为char c;int c;以便它可以在返回时保存 EOF 标记。然后,您还必须更改 while 循环条件以检查 forEOF而不是NULL.

您也可以feof(fr)单独调用来测试文件的结尾,而不是读取字符。如果你这样做了,你可以c作为 a离开char,但你必须feof()在阅读完字符之后但在打印出来之前调用,并使用 abreak退出循环。

于 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. 如果你使用 a 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);printf当您要求仅打印一个字符时,会涉及相当多的开销。

于 2010-01-15T04:03:36.787 回答
1

getc返回一个int

char c更改为int c

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

于 2010-01-15T04:06:27.233 回答