如何读整个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},{}};