如何将任何文件安全地读取为字符串

How to read any file safely into a string?

本文关键字:读取 字符串 文件安全 任何      更新时间:2023-10-16

可能的重复:
在c++中将文件拖入std::字符串的最佳方法是什么?

我正在尝试为C++模仿PHP的file_get_contents()函数。

然而,当我将char数组转换为字符串时,它停止在nullbyte:

fread(charbuf, 1, file_size, fp);
string str(charbuf);

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

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

我希望你们能以其他方式回答"字符串不是二进制容器"。

我要求重新讨论这个问题,因为事实是:"显然,这个问题和以往一样重要:两年后,两种最有效的解决方案仍然会复制内存中的整个文件内容,而优化器无法消除这个副本。这是一种非常不令人满意的情况。–Konrad Rudolph 10月25日6:25"C++中的std::字符串?或者你想让我创建一个新的问题,要求在没有额外字符串副本的情况下读取文件?

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

这个片段将把你的所有文件放入std::string

我希望你能用其他方式回答"字符串不是二进制容器"。

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