我需要读取一个文件并将其发送到一个字符串中,以便我可以解析它。然而,程序不会知道文件的确切长度,如果我想使用
fgets()
,该怎么办?还是有更好的替代方案吗?char *fgets(char *str, size_t num, FILE *stream);
别忘了,fgets()
是一次读取一行,但前提是有足够的空间。
人们很少写超过...80、256或自定义的字符数的长行。POSIX建议每行的长度为4096个字符。因此,我通常使用:
char buffer[4096];
while (fgets(buffer, sizeof(buffer), fp))
{
...process line...
}
如果您担心某人可能在单行中提供超过4K的数据(如HTML或JSON等机器生成的文件),那么您需要决定下一步该做什么。您可以执行以下任何操作(还有可能我没有提到的其他选项):
getline()
,它会为您进行内存分配。getline
,请查看Chuck Falconer的公共领域ggets
/fggets
函数,它们动态增长缓冲区以消耗整个行。 (该链接现在似乎已经失效,但archive.org有一份副本。)分配一个缓冲区(即str
指向的缓冲区),并将缓冲区的大小传递给num
。实际占用的空间只有fgets
读取的文本长度。
类似于:
char str[1000];
fgets(str, 1000, &file);