显然 boost::asio::async_read
不喜欢字符串,因为 boost::asio::buffer
的唯一重载允许我创建 const_buffer
,所以我一直坚持将所有内容读入 streambuf。
现在我想将 streambuf 的内容复制到一个字符串中,但它显然只支持写入 char* (sgetn()
),使用 streambuf 创建一个 istream 并使用 getline()
。
有没有其他方法可以在不过度复制的情况下使用流缓冲区内容创建字符串?
最佳答案
不知道算不算“过度复制”,不过你可以用一个stringstream:
std::ostringstream ss;
ss << someStreamBuf;
std::string s = ss.str();
例如,要将标准输入中的所有内容读入字符串,请执行
std::ostringstream ss;
ss << std::cin.rdbuf();
std::string s = ss.str();
或者,您也可以使用 istreambuf_iterator
。您将不得不衡量这种方式或上述方式是否更快 - 我不知道。
std::string s((istreambuf_iterator<char>(someStreamBuf)),
istreambuf_iterator<char>());
请注意,上面的 someStreamBuf
是用来表示一个 streambuf*
的,因此请根据需要取其地址。还要注意最后一个示例中第一个参数周围的附加括号,这样它就不会将其解释为返回字符串并采用迭代器和另一个函数指针的函数声明(“最令人烦恼的解析”)。
关于c++ - 将 streambuf 的内容复制到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12767800/