如何使用%[^ \ n] s读取空白行?

时间:2011-10-13 15:09:48

标签: c scanf

我有一个程序

fscanf(fp,"%[^\n]s",line);

用于读取一行。

如果我放入一个while循环,

while(!feof(fp))
    fscanf(fp,"%[^\n]s",line);

以上代码适用于第一行,其余部分适用于

  

行为NULL。 (line =“”)

我的文件包含许多行,甚至包含许多空白行。如何使上述代码有效?

2 个答案:

答案 0 :(得分:5)

首先,转化说明符为%[^\n](最后没有s)。

其次,您不希望在没有明确大小的情况下使用%[转换说明符;否则你冒着缓冲区溢出的风险:

char line[132];
...
fscanf(fp, "%131[^\n]", line);

第三,这将在输入流中留下换行符,可能会污染下一次读取。

最后,想要使用feof作为循环条件,因为在之后尝试阅读过去之后它才会返回true EOF,导致你的循环执行太多次。

坦率地说,我认为更好的选择是使用fgets();它将读取所有内容,包括下一个新行小于指定大小的内容。 IOW,如果line的大小设置为包含20个字符且输入行包含80个字符(包括换行符),fgets将读取19个字符并将0终止符追加到line。如果输入行是10个字符,它将整个输入行读入line(包括换行符)。

fgets将在EOF或错误上返回NULL,因此您应该将循环结构为

while (fgets(line, sizeof line, fp))
{
  // do something with line
}
if (feof(fp))
  // hit end of file
else
  // error on read.

答案 1 :(得分:1)

我很确定在扫描集中不允许\ n。如果您说明您要在那里编写代码,将会很有帮助。

如果你想读完整行,我强烈建议你去fgets()库例程。使用fgets(),您可以说明最多读取多少字符,这样您就可以避免缓冲区溢出。