C++ 如果没有';我不知道要读取的字符数?

C++ 如果没有';我不知道要读取的字符数?,c++,c,fstream,fgets,C++,C,Fstream,Fgets,我需要读取一个文件,并将其中的文本发送到一个字符串,以便对其进行解析。但是,程序不知道文件的确切长度,因此如果我想使用fgets(),或者有更好的替代方法,我该怎么办 注: 分配一个缓冲区(str指向的缓冲区),并将缓冲区的大小传递给num。实际占用的空间仅为fgets读取的文本长度 比如: char str[1000]; fgets(str, 1000, &file); 如果下一行在换行符之前只有10个字符,那么str将保存这10个字符、换行符和空终止符 编辑:为了防止出现任何混淆,

我需要读取一个文件,并将其中的文本发送到一个字符串,以便对其进行解析。但是,程序不知道文件的确切长度,因此如果我想使用
fgets()
,或者有更好的替代方法,我该怎么办

注:

分配一个缓冲区(
str
指向的缓冲区),并将缓冲区的大小传递给
num
。实际占用的空间仅为
fgets
读取的文本长度

比如:

char str[1000];
fgets(str, 1000, &file);
如果下一行在换行符之前只有10个字符,那么str将保存这10个字符、换行符和空终止符


编辑:为了防止出现任何混淆,我不想让上面的内容听起来好像缓冲区中的额外空间没有被使用。我只是想说明,您不需要提前知道字符串的长度,只要可以设置最大长度。

您可以迭代使用fgets,但更简单的替代方法是(stdio.h)。它在POSIX中,但不是标准的C

既然你使用C++,那么你可以用STD::string函数吗?比如IoString?

< P>不要忘记每次读取一行,但要有足够的空间。 人类很少写比……长的字。。。80256,选一个数字。。。人物。POSIX建议线路长度为4096。因此,我通常使用:

char buffer[4096];

while (fgets(buffer, sizeof(buffer), fp)) 
{
    ...process line...
}
如果您担心有人可能在一行中提供超过4K的数据(而机器生成的文件,如HTML或JSON,可能包含这些数据),那么您必须决定下一步要做什么。您可以执行以下任一操作(可能还有一些我没有提到的其他选项):

  • 在不假设中间有换行的情况下,以位处理过长的行
  • 为更长的行分配内存(比如说8K开始),将初始4K复制到分配的缓冲区中,并将更多数据读取到缓冲区的后半部分,迭代直到找到行的结尾
  • 使用Linux上提供的POSIX 2008函数。它为您分配内存

  • 如果您不在POSIX系统上,并且没有可用的
    getline
    ,请查看动态增长缓冲区以消耗整个行的方法。(该链接现在似乎已关闭,但是。)

    怎么样?除非您重新分配缓冲区,否则任何额外的空间仍在使用。我指的是缓冲区中的空间,而不是内存中的空间。此外,OP的问题不是关于如何节省内存。你的标题表明你想使用FGET,但文本暗示你正在寻找替代方案。首先是什么让你选择fgets的。。?
    char buffer[4096];
    
    while (fgets(buffer, sizeof(buffer), fp)) 
    {
        ...process line...
    }