2017-01-26 43 views
0

在課堂上,我遇到了這個代碼片段C STDIO()

for (numlines = 0, (fp=fopen("thefile",'r')); feof(fp); numlines++) { 
    fgets(fp, buffer, sizeof(buffer), fp); 
    ... 
} 

在for循環頭與fgets,兩件事情,即numlinesfp,可以初始化,對不對?

在for循環體

然後,

fgets(fp, buffer, sizeof(buffer), fp); 

這是混淆了我。我以爲fgets()函數採用這些參數

char *fgets(char *str, int n, FILE *stream) 

任何想法的2個FPS正在做?

+2

錯誤?這甚至不應該編譯。除非代碼重新定義'fgets'或者做一些其他的詭計(這會很糟糕)。 – kaylum

+2

該代碼片段是純垃圾,句號。 – user3386109

+2

你從哪裏遇到它?也許發現問題是練習的目標。 'feof(fp)'也是錯誤的。 – Barmar

回答

2

任何想法2 fps在做什麼?

這是一個錯字 - 作者在撰寫該聲明時顯然已將他們的電報交叉。編譯器應該抱怨那個調用。

它也應該抱怨fp=fopen("thefile",'r') - 第二個參數應該是"r",而不是'r'

我算至少 3中的那些代碼兩行額外的問題:

  • 筆者不驗證fopen呼叫從文件中讀取之前成功;
  • NEVER使用feof作爲一個循環條件 - 它不會直到後試圖讀到文件的結尾返回true,這意味着你會一次循環過於頻繁,也不會趕上一個實際讀取錯誤;
  • 繼上一次之後,您應該檢查fgets的結果以確保其成功。

IMO,該代碼寫成

fp = fopen("thefile", "r"); 
if (!fp) 
{ 
    // unable to open file, bail out here 
} 

for (numlines = 0; fgets(buffer, sizeof buffer, fp); numlines++) 
{ 
    // do stuff with buffer 
} 

if (feof(fp)) 
{ 
    // normal end of file 
} 
else 
{ 
    // error on read, handle as appropriate 
} 

雖然你可以通話fopen作爲for環路初始化表達式的一部分,你應該做的,作爲一個獨立的操作和確保它在進入循環之前成功

檢查fgets的結果作爲你的循環條件。如果它返回NULL,然後檢查是否原因是EOF或讀取錯誤。