2011-12-18 94 views
4

我需要在txt文件中寫入內容並讀取內容,然後將其打印在屏幕上。 以下是我寫的代碼,它可以正確創建內容並將其寫入文件,但它無法從文件中讀取並正確打印。在C編程中讀取/寫入文本文件

#include<stdio.h> 
#include<stdlib.h> 
main() 
{ 
    char filename[20]={"c:\\test.txt"}; 
    FILE *inFile; 
    char c; 
    inFile=fopen(filename,"w+"); 

    if(inFile==NULL) 
    { 
     printf("An error occoured!"); 
     exit(1); 
    } 
    while((c=getchar())!=EOF) 
     fputc(c,inFile); 
    fputc('\0',inFile); 

    while((c=fgetc(inFile))!=EOF) 
     putchar(c); 
} 

有人會告訴我這個程序有什麼問題,特別是最後兩行。 在此先感謝。

+1

您是否在2011年學習K&R C?沒有更多的隱式'int'類型。 'main'函數需要返回類型。它應該返回一些東西。 – 2011-12-18 09:25:07

+0

作爲參考,Windows API可以處理正斜槓和反斜槓作爲目錄分隔符。我通常更喜歡正斜線,主要是因爲我不必擔心逃脫它們。 – cHao 2011-12-18 09:26:37

回答

7

您需要添加

fseek(inFile, 0, SEEK_SET); 

while ((c=fgetc(inFile)) != EOF) 
    putchar(c); 

因爲文件指針(不是用於內存分配的文件指針)已經移動到最後。要從文件中讀取數據,您必須將其帶到fseek函數的前面。

+0

我可以再次定義文件指針以獲得相同的效果嗎? – geyan 2011-12-18 09:32:44

+0

@geyan抱歉,但你我沒有得到你。你當然可以再次使用fseek(即使超出文件,但不要這樣做) – 2011-12-18 09:35:55

+0

@geyan:你爲什麼要這麼做? 'fseek'是做這件事的慣用方式,並且它工作得很好。沒有理由爲第二個*變量;這隻會讓代碼更混亂 - 我應該再次使用哪一個? – 2011-12-18 09:38:33

1

你需要你寫它後,尋求迴文件的開頭,你開始閱讀之前:

fseek(inFile, 0, SEEK_SET); 
1
char c; 

是您的第一個問題。 getcgetchar返回int s,而不是char s。仔細閱讀手冊頁和更改本地:

int c; 

你還沒有寫操作後​​流復位。把這樣的東西:

fseek(inFile, 0L, SEEK_SET); 

在你開始從該流讀取之前。 (見手冊頁)

最後,您的主簽名不是標準的。使用方法:

int main(void) { ... 
+0

你有什麼工作,但請養成將main()定義爲int main(int argc,char ** argv)的習慣。它會在以後爲你節省大量的悲傷。 – 2011-12-18 09:36:41

+2

而不是fseek inFile,0L,SEEK_SET你也可以說倒回(inFile); (無論如何)對於讀者來說更容易記住和更清楚。這樣的代碼遵循的規則是,在寫入之後和讀取之前,您必須以某種方式重新定位文件的讀取指針。 – 2011-12-18 09:49:06