添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
原始 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);
    
  •