2013-06-20 17 views
0

我在下面的代碼中遇到了一些麻煩,我不能爲我的生活弄清楚什麼地方出了問題,爲什麼它顯示它的作用,任何幫助或幫助將不勝感激。它應該允許輸入5行文本並在屏幕上顯示這5行,但它只允許輸入4行,並顯示4行。請幫忙!文件名字符串錯誤

#include <stdio.h> 

int main() 
{ 
char string[100]; 
char filename[20]; 
int n=0; 
FILE *fp; 
printf(" Enter the name of file to open "); 
scanf("%s",filename); 
fp =fopen(filename,"wr"); 
if(fp==NULL) 
{ 
    printf("unable to open File"); 
} 
for(n=1;n<6;n++) 
{ 
    printf("\nEnter line %d:",n+1); 
    gets(string); 
    fputs(string,fp); 
    fputs("\n",fp); 
} 
fclose(fp); /*close the file*/ 
fp =fopen(filename,"r"); 
if(fp==NULL) 
{ 
    printf("unable to open File"); 
} 
for(n=1;n<6;n++) 
{ 
    fgets(string,100,fp); 
    printf("%s",string); 
} 
fclose(fp); // close after reading. 
return 0; 
} 
+0

要做的第一件事就是使用基於0的循環代替基於1的循環(對於C語言來說更自然 - 我注意到你已經有了一個'n + 1',它看起來像是假定基於0的循環)。除此之外,它看起來應該起作用。嘗試在第一個循環之後打印'n',看看它是否達到了6 ... – John3136

+0

@ John3136他沒有使用任何數組,除了一些他沒有索引的字符串。 – Barmar

+0

如果在每次迭代後'fflush(stdout)'會發生什麼? – n3rd4n1

回答

1

這裏是修改後的代碼。如果文件未打開,則添加gets而不是scanf,並添加return 0;

#include <stdio.h> 

int main() 
{ 
char string[100]; 
char filename[20]; 
int n=0; 
FILE *fp; 
printf(" Enter the name of file to open "); 
gets(filename); 
fp =fopen(filename,"wr"); 
if(fp==NULL) 
{ 
    printf("unable to open File"); 
    return 0; // do not proceed 
} 
for(n=1;n<6;n++) 
{ 
    printf("\nEnter line %d:",n); 
    gets(string); 
    fputs(string,fp); 
    fputs("\n",fp); 
} 
fclose(fp); /*close the file*/ 
fp =fopen(filename,"r"); 
if(fp==NULL) 
{ 
    printf("unable to open File"); 
    return 0; // do not proceed 
} 
for(n=1;n<6;n++) 
{ 
    fgets(string,100,fp); 
    printf("%s",string); 
} 
fclose(fp); // close after reading. 
return 0; 
} 
+0

這很好。謝謝! – The10thDoctor

0

替換得到(文件名)的scanf( 「%s」 時,文件名)

2

的問題是,scanf("%s", filename);不消耗在文件名後換行。所以你第一次打電話給gets()讀這條換行符爲空行。

地址:

gets(string); 

該行後,你開始讀取輸入行之前使用了該行的其餘部分。

0

您來電scanf之後擺脫緩衝區換行的,你可以簡單地添加getchar();

scanf("%s", filename); 
getchar(); 

但不要調整您的循環,以從0開始,因爲你加1至n即:

for(n=0;n<6;n++) 
    ^

做出這些改變,我能夠輸入6號線,然後打印所有的人都出來後。

正如您已經注意到的,如果您沒有正確處理緩衝輸入,緩衝輸入會很麻煩,因爲它可以插入到後續輸入調用中。 Don't be tempted to flush the stdin.

Here是一些關於如何處理此問題的建議替代方案。