我只是想读取文件的每个字符并将其打印出来,但是当文件完成阅读时,但我得到了一堆?完成阅读后。我该如何解决?
#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;
}
答案 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
的测试