在C++中将整个文件读入STD::String的最佳方法是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (46)

如何将文件读入一个文件std::string,即一次读取整个文件?

文本或二进制模式应由调用者指定。该解决方案应符合标准,便携和高效。它不应该不必要地复制字符串的数据,而应该在读取字符串时避免重新分配内存。

这样做的一个方法是统计文件大小,调整std::stringfread()进入std::stringconst_cast<char*>()'编辑data()。这要求std::string数据是连续的,这是标准所不需要的,但是对于所有已知的实现来说似乎都是这样。更糟糕的是,如果文件是以文本模式读取的,文件std::string的大小可能不等于文件的大小。

一个完全正确的,符合标准的和便携式解决方案,可以构建使用std::ifstreamrdbuf()进入std::ostringstream,并从那里进入std::string。但是,这可能会复制字符串数据和/或不必要地重新分配内存。所有相关的标准库实现是否足够聪明以避免所有不必要的开销?还有另一种方法可以做到吗?我错过了一些隐藏的Boost功能,它已经提供了所需的功能吗?

请给出你的建议如何实现它。

void slurp(std::string& data, bool is_binary)
提问于
用户回答回答于

CTT的解决方案:

string readFile2(const string &fileName)
{
    ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate);

    ifstream::pos_type fileSize = ifs.tellg();
    ifs.seekg(0, ios::beg);

    vector<char> bytes(fileSize);
    ifs.read(bytes.data(), fileSize);

    return string(bytes.data(), fileSize);
}
用户回答回答于

string str(static_cast<stringstream const&>(stringstream() << in.rdbuf()).str());

这需要<sstream>字符串流的附加头文件。(这static_cast是必要的,因为operator <<回报是一个普通的老,ostream&但我们知道,实际上它是一个,stringstream&所以演员是安全的。)

分成多行,将临时移动到一个变量,我们得到一个更易读的代码:

string slurp(ifstream& in) {
    stringstream sstr;
    sstr << in.rdbuf();
    return sstr.str();
}

或者,再一次在一行中:

string slurp(ifstream& in) {
    return static_cast<stringstream const&>(stringstream() << in.rdbuf()).str();
}

扫码关注云+社区