【发布时间】:2012-09-13 23:02:38
【问题描述】:
可能重复:
What is the best way to slurp a file into a std::string in c++?
我正在尝试为 C++ 模仿 PHP 的 file_get_contents() 函数。
但是,当我将 char 数组转换为字符串时,它会在 nullbyte 处停止:
fread(charbuf, 1, file_size, fp);
string str(charbuf);
如何将字符串初始化为静态大小的数组,并将文件内容直接读取到该容器?另外,我如何检查它的错误,例如,如果没有足够的内存来初始化该字符串。这也可以让我摆脱我目前正在使用的临时内存分配,我想摆脱它。
安全性如何?是否有可能许多进程同时读取同一个文件和/或其中一个进程在我读取它时同时写入它?如何避免此类事情发生?
希望你能回答“字符串不是二进制容器”以外的其他方式。
我要求重新提出这个问题:“显然,这个问题与以往一样重要:两年后,两个最有效的解决方案仍然将整个文件内容复制到内存中,并且优化器无法忽略此副本。这是一种非常不令人满意的情况。– Konrad Rudolph 2010 年 10 月 25 日 6:25" What is the best way to read an entire file into a std::string in C++?有额外的字符串副本吗?
【问题讨论】:
-
使用
ifstream有什么问题吗? stackoverflow.com/questions/2912520/… -
@loler,这是否只分配了与 file_size 相同的内存量?还是它会创建字符串的临时副本? (例如,如果文件为 100MB,是否在程序的某个阶段分配了 200MB?)。
-
是不是很有趣,这个“完全重复”有 -2 票,但重复有 +18 票?我猜它并不像你想象的那样完全重复。
-
不,这并不好笑,也不出人意料。有助于感知问题质量的一件事是对其进行的研究。关于这个主题至少有两个很好的问题;这个问题可能因为您没有找到而被否决。
-
另外,字符串是一个二进制容器。它可以很好地包含 NUL,并且它对存储的内容不做任何假设,例如,甚至不考虑字节序。