[英]C stdio fgets()
在課堂上,我遇到了這個代碼片段
for (numlines = 0, (fp=fopen("thefile",'r')); feof(fp); numlines++ ) {
fgets(fp, buffer, sizeof(buffer), fp);
...
}
在for循環頭中,可以初始化numlines
和fp
兩件事,對嗎?
然后在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.