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