我有一个文本文件"hello.txt"
,我需要读取该文件并写入stdout
10次,我该怎么办?
我现在正在做的事情如下: -
#include<stdio.h>
main(){
int c,i;
FILE *fp;
for(i=0;i<10;++i) {
fp = fopen("hello.txt","r");
for(;c!=EOF;c= getc(fp),putchar(c));
fclose(fp);
}
return 0;
}
此代码仅打印一次内容,但不 10次。
答案 0 :(得分:2)
错误是在第一次迭代结束时,变量c
的值变为EOF,并且在所有下一次迭代中,由于c != EOF
的循环条件而导致循环中断,并且无法打印任何字符。实际上,您使用未初始化的c
进行比较会导致代码中的未定义行为为@ alk通知,并且comment会导致您的问题。
你应该(重新)在每个for循环开始时初始化c
。
替换:
for(;c!=EOF;c= getc(fp),putchar(c));
by:
for(c = getc(fp); c != EOF; putchar(c), c= getc(fp));
// ^^ always initialize ^^ ^^ swap order
此外,如果您想要一次又一次地读取文件,那么更好的方法是使用void rewind ( FILE * stream );
函数,您需要将文件指针倒回到文件的开头循环,如:
fp = fopen("hello.txt", "r");
for(i = 0; i < 10; ++i) {
for(c = getc(fp); c != EOF; c = getc(fp), putchar(c));
rewind(fp);
}
fclose(fp);
注意:在;
和,
之后使代码可读使用空间。
答案 1 :(得分:2)
#include<stdio.h>
main(){
int c,i;
FILE *fp;
for(i=0;i<10;++i) {
fp = fopen("hello.txt","r");
while ((c = getc(fp)) != EOF) {
putchar(c);
}
fclose(fp);
}
return 0;
}
当你的代码c
成为OF时,循环将永远被忽略!
答案 2 :(得分:2)
您必须在再次读取文件之前初始化c
。在c
为EOF
后,您的代码会永久保留,并且不会进入for
循环。
c = 0;
for(;c!=EOF;c= getc(fp),putchar(c));