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

发布于 2024-12-09 10:18:48 字数 302 浏览 0 评论 0原文

我有一个程序

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

用于读取一行。

如果我放入 while 循环,

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

上面的代码适用于第一行,其余部分,我得到

行为 NULL。 (行=“”)

我的文件包含很多行,甚至很多空行。我怎样才能使上面的代码工作?

I am having a program where

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

is used for reading a line.

If I put in a while loop,

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

the above code works for first line and for the rest, I am getting

line as NULL. ( line = "" )

My file contains many lines even many blank lines. How can I make the above code work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

过潦 2024-12-16 10:18:48

首先,转换说明符为 %[^\n] (末尾没有 s)。

其次,您不想在没有明确大小的情况下使用 %[ 转换说明符;否则,您将面临缓冲区溢出的风险:

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

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

最后,您不想使用feof作为循环条件,因为直到您尝试读取过去之后它才会返回true EOF,导致循环执行次数过多。

坦率地说,我认为更好的选择是使用 fgets();它将读取所有内容,直到并包括下一个换行符小于指定大小的一个。 IOW,如果 line 的大小为容纳 20 个字符,并且输入行有 80 个字符(包括换行符),fgets 将读取 19 个字符并将 0 终止符附加到 行。如果输入行有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.

First, the conversion specifier would be %[^\n] (no s on the end).

Secondly, you don't want to use the %[ conversion specifier without an explicit size; otherwise you run the risk of a buffer overflow:

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

Third, this will leave the newline in the input stream, potentially fouling up the next read.

Finally, you don't want to use feof as your loop condition, since it won't return true until after you try to read past EOF, causing your loop to execute one too many times.

Frankly, I think the better option is to use fgets(); it will read everything up to and including the next newline or one less than the specified size. IOW, if line is sized to hold 20 characters and the input line has 80 characters (including the newline), fgets will read 19 characters and append the 0 terminator into line. If the input line is 10 characters, it will read the whole input line into line (including the newline).

fgets will return NULL on EOF or error, so you should structure your loop as

while (fgets(line, sizeof line, fp))
{
  // do something with line
}
if (feof(fp))
  // hit end of file
else
  // error on read.
混吃等死 2024-12-16 10:18:48

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

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

I'm pretty sure that \n is not allowed within a scanset. It would be helpful if you state what you're trying to code there.

If you want to read in entire lines, I'd strongly suggest you go for the fgets() library routine. With fgets() you're able to state, how much characters to read in at max, so you're able to avoid buffer overflows.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文