如何读整个stream到一个std ::string?

我正在尝试将整个stream(多行)读入一个string。

我正在使用这个代码,它的工作原理,但它的冒犯我的风格…当然有一个更简单的方法? 也许使用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. 

实际上,对一个string的const引用也可以做到这一点,这可能会让事情变得更简单。

 const std::string &s(... a miracle occurs here...) 

怎么样

 std::istreambuf_iterator<char> eos; std::string s(std::istreambuf_iterator<char>(stream), eos); 

(如果不是MVP,可能是单线)

2011年后编辑,这种方法现在拼写

 std::string s(std::istreambuf_iterator<char>(stream), {}); 

我迟到了,但这是一个相当有效的解决scheme:

 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; } 

我做了一些基准testing,事实certificatestd::istreambuf_iterator技术( 被接受的答案使用 )实际上要慢得多。 在使用-O3 gcc 4.4.5上,在我的机器上差不多是4.5倍,差距随着较低的优化设置而变宽。

你可以做

 std::string s; std::ostringstream os; os<<stream.rdbuf(); s=os.str(); 

但我不知道它是否更有效率。

替代版本:

 std::string s; std::ostringstream os; stream>>os.rdbuf(); s=os.str(); 

你可以尝试使用algorithm的东西。 我必须准备好工作,但是这里有一个非常迅速的刺(有一个更好的方法):

 copy( istreambuf_iterator<char>(stream), istreambuf_iterator<char>(), back_inserter(s) ); 

那么,如果你正在寻找一个简单和“可读”的方式来做到这一点。 我会build议你的项目添加/使用一些高层次的框架。 为此我总是在我所有的项目中使用Poco和Boost。 在这种情况下,与波科:

  string text; FileStream fstream(TEXT_FILE_PATH); StreamCopier::copyToString(fstream, text); 

也许这1行C ++ 11解决scheme:

 std::vector<char> s{std::istreambuf_iterator<char>{in},{}};