我需要读取一个文件并将文本从它发送到一个字符串,以便我可以解析它。但是,程序不会准确知道文件的长度,所以如果我想使用fgets()
,或者有更好的选择,我会怎么做?
注意:
char *fgets(char *str, size_t num, FILE *stream);
答案 0 :(得分:9)
不要忘记fgets()
一次读取一行,但要有足够的空间。
人类很少写行超过... 80,256,选择一个数字......字符。 POSIX建议行长度为4096.因此,我通常使用:
char buffer[4096];
while (fgets(buffer, sizeof(buffer), fp))
{
...process line...
}
如果您担心某人可能在一行中提供超过4K的数据(并且机器生成的文件,例如HTML或JSON,可能包含该数据),那么您必须决定下一步该做什么。您可以执行以下任何操作(并且可能还有其他一些我未提及的选项):
getline()
。它为你做内存分配。答案 1 :(得分:3)
您可以迭代地使用fgets,但更简单的替代方法是(stdio.h)getline。它在POSIX中,但它不是标准C。
既然你正在使用C ++,你可以使用像iostream getline这样的std :: string函数吗?
答案 2 :(得分:3)
如果您不在POSIX系统上并且没有getline
可用,请查看Chuck Falconer's public domain ggets
/fggets
functions,它会动态增加缓冲区以消耗整行。 (那个链接现在似乎已经下降,但是archive.org has a copy。)
答案 3 :(得分:0)
分配一个缓冲区(str
指向的缓冲区),并传递num
缓冲区的大小。所占用的实际空间仅为fgets
所读取文本的长度。
类似的东西:
char str[1000];
fgets(str, 1000, &file);
如果下一行在换行符之前只有10个字符,那么str将保存这10个字符,换行符和空终止符。
编辑:为了防止出现任何混淆,我并不打算将上述内容听起来好像缓冲区中的额外空间未被使用。我只是想说明你不需要提前知道你的字符串将持续多长时间,只要你能在它上面加上最大长度。