本文說明當您使用 Fscanf
函式讀取文字行時所發生的問題。
原始產品版本: Visual C
原始 KB 編號: 60336
摘要
在文字模式中開啟檔案時,嘗試使用 函 Fscanf
式讀取文字行可能會失敗,而且只會從檔案讀取一行文字。 分隔符設定為 [^\n]
。 函 Fscanf
式會讀取最多,但不包含分隔字元。 因此,檔案數據流會在檔案中的第一個 \n
停止。 後續 Fscanf
的函式呼叫會失敗,因為檔案指標會保留在分隔字元,而且函 Fscanf
式無法將函式指標往前移動。 若要將檔案指標移過分隔字元,請使用下列兩種方法之一:
更新程式代碼以使用下列
Fscanf
函數呼叫:fscanf(stream, "%[^\n]%*c", line)
%*c
格式規範會從輸入數據流讀取一個字元,但不會將它指派給函數調用中的任何fscanf
參數。在函數調用之後呼叫 函
Fgetc
式,將檔案指標移至字元之外\n
。Fscanf
下列程式代碼範例示範此問題。 程式代碼範例應該從文本文件讀取和列印行,直到到達 EOF 為止。 不過,程式代碼範例只會從檔案讀取第一行。 由於找不到檔字元的結尾,如果檔案數據流包含 \n
字元,程式代碼範例就會在無限迴圈中執行。
程式碼範例
FILE *stream;
char line[80];
while ((fscanf(stream, "%[^\n]", line))!= EOF )
{
printf("Line = %s \n",line);
}
下列程式代碼範例示範上述第二個方法來解決此問題:
FILE *stream;
char line[80];
while ((fscanf(stream, "%[^\n]", line))!= EOF)
{
fgetc(stream); // Reads in '\n' character and moves file
// stream past delimiting character
printf("Line = %s \n", line);
}