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>
.
我认为 using&string[0]
就可以了,它应该与广泛使用的标准库实现一起工作(即使它在技术上是 UB)。
但既然您提到要将数据放入 an 中istringstream
,那么这里有一个替代方案:
new char[in.tellg()]
)stringstream
(不带前导“i”)无论如何,都istringstream
必须复制数据,因为据我所知, astd::stringstream
不会在内部存储 a ,因此您可以离开并直接将数据放入其中。std::string
std::string
编辑:实际上,除了手动分配(或make_unique
)之外,您还可以使用您提到的方法vector<char>
。