共用方式為


Fscanf 函式不會如預期般讀取連續行

本文說明當您使用 Fscanf 函式讀取文字行時所發生的問題。

原始產品版本: Visual C
原始 KB 編號: 60336

摘要

在文字模式中開啟檔案時,嘗試使用 函 Fscanf 式讀取文字行可能會失敗,而且只會從檔案讀取一行文字。 分隔符設定為 [^\n]。 函 Fscanf 式會讀取最多,但不包含分隔字元。 因此,檔案數據流會在檔案中的第一個 \n 停止。 後續 Fscanf 的函式呼叫會失敗,因為檔案指標會保留在分隔字元,而且函 Fscanf 式無法將函式指標往前移動。 若要將檔案指標移過分隔字元,請使用下列兩種方法之一:

  • 更新程式代碼以使用下列 Fscanf 函數呼叫:

    fscanf(stream, "%[^\n]%*c", line)
    

    %*c格式規範會從輸入數據流讀取一個字元,但不會將它指派給函數調用中的任何fscanf參數。

  • 在函數調用之後呼叫 函Fgetc式,將檔案指標移至字元之外\nFscanf

下列程式代碼範例示範此問題。 程式代碼範例應該從文本文件讀取和列印行,直到到達 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);
}