读取和写入文件内容10次

时间:2014-02-16 06:16:13

标签: c file

我有一个文本文件"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次。

3 个答案:

答案 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。在cEOF后,您的代码会永久保留,并且不会进入for循环。

c = 0;
for(;c!=EOF;c= getc(fp),putchar(c));