如何将文件读入a std::string,即一次读取整个文件?
文本或二进制模式应由调用者指定.该解决方案应符合标准,便携且高效.它不应该不必要地复制字符串的数据,它应该避免在读取字符串时重新分配内存.
实现此目的的一种方法是统计文件大小,调整大小std::string和fread()进入std::string's const_cast<char*>()' data().这要求std::string数据是连续的,这是标准不需要的,但似乎是所有已知实现的情况.更糟糕的是,如果在文本模式下读取文件,则其std::string大小可能与文件大小不同.
一个完全正确的,符合标准的和便携式解决方案,可以构建使用std::ifstream的rdbuf()进入std::ostringstream,并从那里进入std::string.但是,这可能会复制字符串数据和/或不必要地重新分配内存.所有相关的标准库实现是否足够智能以避免所有不必要的开销?还有另一种方法吗?我是否错过了一些已经提供所需功能的隐藏Boost功能?
请显示您的建议如何实施.
void slurp(std::string& data, bool is_binary)
Run Code Online (Sandbox Code Playgroud)
考虑到上面的讨论.
我想询问有效C++中的具体要点.
它说:
如果一个类需要像多态类一样运行,那么析构函数应该是虚拟的.它进一步补充说,由于
std::string没有虚拟析构函数,因此永远不应该从中派生出来.还std::string甚至没有设计成一个基类,忘记多态基类.
我不明白一个类中具体要求什么才有资格成为基类(不是多态的)?
我不应该从std::string类派生的唯一原因是它没有虚拟析构函数吗?为了可重用性,可以定义基类,并且多个派生类可以从中继承.那么什么使得std::string甚至没有资格成为基类?
此外,如果存在纯粹为可重用性目的而定义的基类,并且有许多派生类型,是否有任何方法可以阻止客户端执行,Base* p = new Derived()因为这些类并不是要多态地使用?
既然std::string实际上是typedef模板类,我怎么能覆盖呢?我想制作一个std::string能返回正确长度的UTF-8 .