用C++读取大字符串 - 是否有安全快速的方法?

Moh*_*han 6 c++ string stl file

http://insanecoding.blogspot.co.uk/2011/11/how-to-read-in-file-in-c.html回顾了在C++中将整个文件读入字符串的多种方法.最快选项的关键代码如下所示:

std::string contents;
in.seekg(0, std::ios::end);
contents.resize(in.tellg());
in.seekg(0, std::ios::beg);
in.read(&contents[0], contents.size());
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不安全,因为它依赖string于以特定方式实施.例如,如果实现是共享字符串,那么修改数据&contents[0]可能会影响正在读取的字符串之外的字符串.(更一般地说,不能保证这不会破坏任意记忆 - 在实践中不太可能发生,但依靠它不是好习惯.)

C++和STL旨在提供高效的C语言功能,因此可以预期上述版本的速度同样快,但保证安全.

在这种情况下vector<T>,有一些函数可用于访问原始数据,可用于有效地读取向量:

T* vector::data();
const T* vector::data() const; 
Run Code Online (Sandbox Code Playgroud)

其中第一个可以用来vector<T>有效地阅读.不幸的是,string等价物提供了const变体:

const char* string::data() const noexcept;
Run Code Online (Sandbox Code Playgroud)

所以这不能用于有效地读取字符串.(可能non-const省略了变体以支持共享字符串实现.)

我还检查了字符串构造函数,但接受char*复制数据的那些 - 没有选项可以移动它.

有没有一种安全快捷的方法将文件的全部内容读入字符串?

值得注意的是,我想读取一个string而不是一个,vector<char>以便我可以使用a来访问结果数据istringstream.没有相同的vector<char>.

moo*_*are 1

我认为 using&string[0]就可以了,它应该与广泛使用的标准库实现一起工作(即使它在技术上是 UB)。

但既然您提到要将数据放入 an 中istringstream,那么这里有一个替代方案:

  1. 将数据读入char数组( new char[in.tellg()])
  2. 构造一个stringstream(不带前导“i”)
  3. 使用stringstream::write插入数据

无论如何,都istringstream必须复制数据,因为据我所知, astd::stringstream不会在内部存储 a ,因此您可以离开并直接将数据放入其中。std::stringstd::string

编辑:实际上,除了手动分配(或make_unique)之外,您还可以使用您提到的方法vector<char>