Fscanf 函数不会按预期读取连续行

本文介绍使用 Fscanf 函数读取文本行时发生的问题。

原始产品版本: Visual C
原始 KB 数: 60336

总结

当文件在文本模式下打开时,尝试使用 Fscanf 函数读取文本行可能会失败,并且仅从文件中读取一行文本。 分隔符设置为 [^\n]。 该 Fscanf 函数将向上读取,但不包括分隔符。 因此,文件流在文件中的第一个 \n 位置停止。 后续 Fscanf 函数调用失败,因为文件指针保留在分隔符处,并且 Fscanf 该函数无法将函数指针向前移动。 若要将文件指针移过分隔符,请使用以下两种方法之一:

  • 更新代码以使用以下 Fscanf 函数调用:

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

    %*c格式说明符从输入流中读取一个字符,但不将其分配给函数调用中的任何fscanf参数。

  • Fgetc在函数调用后Fscanf调用函数以将文件指针移到字符之外\n

下面的代码示例演示了此问题。 代码示例应从文本文件中读取和打印行,直到到达 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);
}