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,可能包含这些数据),那么您必须决定下一步要做什么。您可以执行以下任一操作(可能还有一些我没有提到的其他选项):
如果您不在POSIX系统上,并且没有可用的
getline
,请查看动态增长缓冲区以消耗整个行的方法。(该链接现在似乎已关闭,但是。)怎么样?除非您重新分配缓冲区,否则任何额外的空间仍在使用。我指的是缓冲区中的空间,而不是内存中的空间。此外,OP的问题不是关于如何节省内存。你的标题表明你想使用FGET,但文本暗示你正在寻找替代方案。首先是什么让你选择fgets的。。?
char buffer[4096];
while (fgets(buffer, sizeof(buffer), fp))
{
...process line...
}