如何将文件一次性读入std::string
?即,整个文件一次性读取。
文本或二进制模式应由调用者指定。解决方案应符合标准、可移植且高效。它不应不必要地复制字符串数据,并且在读取字符串时应避免重新分配内存。
一种方法是使用stat函数获取文件大小,调整std::string
的大小并使用fread()
将内容读入std::string
的const_cast<char*>()
转换后的data()
中。这需要std::string
的数据是连续的,这在标准中没有要求,但它似乎适用于所有已知的实现。更糟糕的是,如果以文本模式读取文件,则std::string
的大小可能不等于文件的大小。
一个完全正确、符合标准和可移植的解决方案可以使用std::ifstream
的rdbuf()
读入std::ostringstream
,然后再将其读入std::string
。但是,这可能会复制字符串数据并/或不必要地重新分配内存。
- 所有相关的标准库实现是否都足够聪明,能避免所有不必要的开销?
- 是否有其他方法可以实现?
- 我是否错过了一些隐藏的Boost函数,已经提供所需的功能?
void slurp(std::string& data, bool is_binary)
rdbuf
并不是最快的,read
才是。 - legends2k