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

时间:2012-09-21 13:54:04

标签: c++ string file

  

可能重复:
  What is the best way to slurp a file into a std::string in c++?

我正在尝试模仿PHP的C ++文件_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++?或者你想要我创建一个新的问题,要求阅读一个文件没有额外的字符串副本?

2 个答案:

答案 0 :(得分:6)

std::ifstream fin("somefile.txt");
std::stringstream buffer;
buffer << fin.rdbuf();
std::string result = buffer.str();

此代码段会将您的所有文件放入std :: string

答案 1 :(得分:0)

  

我希望你能回答“字符串不是二进制容器。

。”

std::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);