本文介绍使用 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);
}