簡體   English   中英

C stdio fgets()

[英]C stdio fgets()

在課堂上,我遇到了這個代碼片段

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

在for循環頭中,可以初始化numlinesfp兩件事,對嗎?

然后在for循環的主體中,

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

這就是讓我感到困惑的..我以為fgets()函數采用了這些參數

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

知道2 fps在做什么嗎?

知道2 fps在做什么嗎?

這是一個錯字-作者在撰寫該聲明時顯然已將其思路交叉了。 編譯器應該抱怨該調用。

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

在這兩行代碼中,我至少算出 3個其他問題:

  • 作者從文件讀取之前無法驗證fopen調用是否成功;
  • 永遠不要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
}

雖然您可以for循環中將fopen作為初始化程序表達式的一部分進行調用,但是您應該將其作為單獨的操作進行操作,並進入循環之前確保它成功。

檢查fgets的結果作為循環條件。 如果返回NULL檢查原因是EOF還是讀取錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM