2014-02-16 39 views
1

我有一個文本文件"hello.txt",我需要讀取該文件並寫入stdout 10次,我該怎麼做?讀取和寫入文件的內容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; 
} 

此代碼打印內容只有1次,但 10倍。

+0

一個好的做法是嘗試和調試程序來查找錯誤。 –

+1

第一次進入循環時,代碼已經運行到未定義的行爲,因爲'c'是針對'EOF'的測試,沒有在此之前進行初始化。讀取未初始化的變量會引發未定義的行爲。 – alk

回答

2

錯誤在於,在第一次迭代結束時,變量c的值變爲EOF,並且在所有下一次迭代中由於c != EOF for循環的條件而導致循環中斷,並且無法打印任何字符。事實上,您正在使用未初始化的c進行比較,導致您的代碼中出現未定義的行爲,例如@alk通知,還有comment對您的問題。

您應該在每個for循環開始時重新初始化c

替換:

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

由:

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); 

注意:在;,之後使代碼可讀的使用空間。

+0

並非真正令人費解:「重新初始化」應該更好地「重新初始化」。請參閱我對OP的評論。 – alk

+0

@alk是的,你是對的,我甚至沒有注意到。現在我在答覆中添加了謝謝。 –

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成爲EOF時,循環將永遠被忽略!

+0

ohh謝謝你回覆 – avinashse

+1

@ GrijeshChauhan-不需要 - 最後一行需要上下文 –

2

您必須在再次讀取文件之前初始化c。在你的代碼中,一旦cEOF,它將永久保留,並且不在for循環中。

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