如果你不知道要读取的字符数,如何使用fgets?

vet*_*982 8 c c++ fstream fgets

我需要读取一个文件并将其中的文本发送到一个字符串,以便我可以解析它.但是,程序不会确切地知道文件的长度,所以如果我想使用fgets(),或者有更好的选择,我该怎么办?

注意:

char *fgets(char *str, size_t num, FILE *stream);
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 10

不要忘记,只要fgets()有足够的空间,一次读取一行.

人类很少写行超过... 80,256,选择一个数字......字符.POSIX建议行长度为4096.所以,我通常使用:

char buffer[4096];

while (fgets(buffer, sizeof(buffer), fp)) 
{
    ...process line...
}
Run Code Online (Sandbox Code Playgroud)

如果您担心某人可能在一行中提供超过4K的数据(并且机器生成的文件,例如HTML或JSON,可能包含该数据),那么您必须决定下一步该做什么.您可以执行以下任何操作(并且可能还有其他一些我未提及的选项):

  1. 以位为单位处理过长行而不假设其间存在换行符.
  2. 为更长的行分配内存(比如8K开始),将初始4K复制到分配的缓冲区,并将更多数据读入缓冲区的后半部分,迭代直到找到行尾.
  3. 使用getline()Linux上提供的POSIX 2008功能.它为你做内存分配.