【发布时间】:2021-09-26 09:02:29
【问题描述】:
在这段代码中,我试图从文件中读取数据(每行 30 个字符),内容为:
你好世界!学习编码!
123456789123456789123456789123
用来读取这个文件的代码是:
#include<stdio.h>
#include<stddef.h>
int main(void)
{
FILE *fptr = fopen("n","r");
char buff[30];
char *buff_ptr = buff;
size_t buff_size=30;
size_t character_count=0;
buff_ptr = fgets(buff,buff_size,fptr);
printf("%s\n",buff_ptr);
fgets(buff,buff_size,fptr);
printf("%s\n",buff);
return 0;
}
为什么第二个fgets没有输出?
【问题讨论】:
-
你的文件真的有空行吗?也许您打印了那个空白行并认为它没有打印任何东西?
fgets返回又是什么?它可能会失败,然后会返回NULL,这是您始终需要检查的内容(以及检查fopen是否也不会失败)。 -
@Someprogrammerdude
fgets正在返回指向正在保存内容的缓冲区的指针,并且正在读取的文本文件中没有空行。 -
30 在这段代码中不是一个快乐的幻数,你至少需要 32 才能读取一行。一个额外的行尾,一个额外的零终止符。
-
@user3121023 所以如果另一个
fgets被添加到代码中,那么文件的下一行将被读取?还有,为什么使用getline时不会出现这个问题? -
知道,您可以读取整个文件,一次读取 29 个字节。这没什么错,您只是更频繁地调用
fgets(),导致效率略有下降。教训:不要吝啬缓冲区大小。1024是一个不错的 1K 缓冲区,2048是一个 2K 缓冲区。