Rod*_*ddy 68 c++ string stream
我正在尝试将整个流(多行)读成字符串.
我正在使用这个代码,它有效,但它冒犯了我的风格......当然有一种更简单的方法吗?也许使用stringstreams?
void Obj::loadFromStream(std::istream & stream)
{
std::string s;
std::streampos p = stream.tellg(); // remember where we are
stream.seekg(0, std::ios_base::end); // go to the end
std::streamoff sz = stream.tellg() - p; // work out the size
stream.seekg(p); // restore the position
s.resize(sz); // resize the string
stream.read(&s[0], sz); // and finally, read in the data.
Run Code Online (Sandbox Code Playgroud)
const对字符串的引用也可以,这可能会使事情变得更容易......
const std::string &s(... a miracle occurs here...)
Run Code Online (Sandbox Code Playgroud)
Cub*_*bbi 107
怎么样
std::istreambuf_iterator<char> eos;
std::string s(std::istreambuf_iterator<char>(stream), eos);
Run Code Online (Sandbox Code Playgroud)
(如果不是MVP,可能是单线)
在2011年后编辑,这种方法现在拼写
std::string s(std::istreambuf_iterator<char>(stream), {});
Run Code Online (Sandbox Code Playgroud)
Joe*_*ams 24
我迟到了,但这是一个相当有效的解决方案:
std::string gulp(std::istream &in)
{
std::string ret;
char buffer[4096];
while (in.read(buffer, sizeof(buffer)))
ret.append(buffer, sizeof(buffer));
ret.append(buffer, in.gcount());
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我做了一些基准测试,事实证明该std::istreambuf_iterator技术(被接受的答案使用)实际上要慢得多.在gcc 4.4.5上-O3,它在我的机器上差异大约是4.5倍,并且随着优化设置的降低,差距变得更大.
Mat*_*lia 18
你可以做到
std::string s;
std::ostringstream os;
os<<stream.rdbuf();
s=os.str();
Run Code Online (Sandbox Code Playgroud)
但我不知道它是否更有效率.
替代版本:
std::string s;
std::ostringstream os;
stream>>os.rdbuf();
s=os.str();
Run Code Online (Sandbox Code Playgroud)
whe*_*ies 11
您可以尝试使用算法中的某些内容.我必须为工作做好准备,但这里有很快的事情(必须有更好的方法):
copy( istreambuf_iterator<char>(stream), istreambuf_iterator<char>(), back_inserter(s) );
Run Code Online (Sandbox Code Playgroud)