我有一个程序
fscanf(fp,"%[^\n]s",line);
用于读取一行。
如果我放入一个while循环,
while(!feof(fp))
fscanf(fp,"%[^\n]s",line);
以上代码适用于第一行,其余部分适用于
行为NULL。 (line =“”)
我的文件包含许多行,甚至包含许多空白行。如何使上述代码有效?
答案 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(),您可以说明最多读取多少字符,这样您就可以避免缓冲区溢出。