C++ 如何将任何文件安全地读入字符串?

C++ 如何将任何文件安全地读入字符串?,c++,string,file,C++,String,File,可能重复: 我试图模仿PHP的FielyGETYONFIX函数C++。 但是,当我将char数组转换为字符串时,它会在nullbyte处停止: fread(charbuf, 1, file_size, fp); string str(charbuf); 如何将字符串初始化为静态大小数组,并将文件内容直接读取到该容器?此外,如何检查错误,例如,如果没有足够的内存初始化该字符串。这也将使我摆脱目前使用的临时内存分配,我想摆脱它 安全性如何?在我读取同一文件时,是否可能有多个进程同时读取同一文件和

可能重复:

我试图模仿PHP的FielyGETYONFIX函数C++。 但是,当我将char数组转换为字符串时,它会在nullbyte处停止:

fread(charbuf, 1, file_size, fp);
string str(charbuf);
如何将字符串初始化为静态大小数组,并将文件内容直接读取到该容器?此外,如何检查错误,例如,如果没有足够的内存初始化该字符串。这也将使我摆脱目前使用的临时内存分配,我想摆脱它

安全性如何?在我读取同一文件时,是否可能有多个进程同时读取同一文件和/或其中一个进程同时写入该文件?我如何避免这种事情发生

我希望你们能用另一种方式回答,字符串不是二进制容器

我要求重新讨论这个问题是因为这样一个事实:显然,这个问题和以往一样重要:两年后,两个最有效的解决方案仍然复制内存中的整个文件内容,而优化器无法忽略这个副本。这是一个相当令人不满意的状况Konrad Rudolph 10月25日6:25在,还是你想让我创建一个新问题,要求我在没有额外字符串副本的情况下阅读文件

std::ifstream fin("somefile.txt");
std::stringstream buffer;
buffer << fin.rdbuf();
std::string result = buffer.str();
此代码段将把所有文件放入std::string

我希望你们能用另一种方式回答,字符串不是二进制容器

string是一个二进制容器,但是您选择的构造函数将C样式的字符串作为参数。请尝试其他构造函数:

std::fread(charbuf, 1, file_size, fp);
std::string str(charbuf, file_size);
编辑:考虑避免内存分配的要求:

std::string str(file_size, 0);
std::fread(&str[0], 1, file_size, fp);

使用ifstream有什么问题吗@loler,这是否只分配了文件大小所需的内存量?还是创建字符串的临时副本?例如,如果文件是100MB,它是否在程序的某个阶段分配了200MB?这个副本有-2票,但副本有+18票,这不是很有趣吗?我想它并不像你想的那样完全一样。不,它既不好笑,也不出乎意料。有助于提高问题质量的因素之一是对问题的研究。在这个问题上至少有两个很好的问题;这个问题可能被否决了,因为您没有找到它们。另外,string是一个二进制容器。它可以很好地包含NUL,并且它对存储的内容不做任何假设,例如,甚至不包括endianness。。。所以,如果我读取100MB的文件,我会同时为char*和std:string分配200MB的数据。如果我一次只分配100MB的数据,效率会更高。看。这似乎是这里的另一个人所说的,它仍然在使用临时内存,所以我可以同时为100MB的文件分配200MB的数据。我可以使用str.resize吗。。。?似乎有这样的功能。@菜鸟,因为它不工作。由于一个非常简单的原因,您无法将fread转换为std::string:如何使str.size返回正确的值?提示:str.resize将用零覆盖所有内容。还有额外的内存分配:您将复制缓冲区转换为字符串。。。我想避免所有这些,只需将其直接读取到字符串容器中,而无需任何附加分配。目前的编译器具有rvo值优化。这里的临时对象没有问题。@Rookie老实说,你对一次分配多多少少关心些什么,除非你在嵌入式系统上,否则它不会让你慢那么多。@Rookie:我能理解这种情绪。然而,许多看起来像复制数据的C++构造实际上并不存在。这不是因为C++是愚蠢的,相反,这是因为C++可以优化一些其他语言不能的东西。优化的第一条规则:衡量,优化,衡量。@菜鸟:这让我们回到原点:我理解情绪。。。我真的喜欢。但是您仍然没有衡量编译器是否可以优化库中的调用。而且,对于像你我这样的完美主义者来说,不幸的是,在关键路径之外,简单性和可读性胜过优化。这是一份有着超过12年实践经验的声明。