std::ostringstream
提供了没有公共接口可以访问其内存缓冲区,除非它不可移植地支持pubsetbuf
(即使这样,您的缓冲区也是固定大小,参见cppreference示例)
如果您想折磨一些字符串流,您可以使用受保护的接口来访问缓冲区:
#include <iostream>
#include <sstream>
#include <vector>
struct my_stringbuf : std::stringbuf {
const char* my_str() const { return pbase(); }
};
int main()
{
std::vector<float> v = {1.1, -3.4, 1/7.0};
my_stringbuf buf;
std::ostream ss(&buf);
for(unsigned int i=0; i < v.size(); ++i)
ss << v[i] << ' ';
ss << std::ends;
std::cout << buf.my_str() << '\n';
}
直接访问自动调整大小的输出流缓冲区的标准C ++方法是通过std::ostrstream
提供的,它在C ++ 98中已被弃用,但仍然是标准C ++14及以上版本。
#include <iostream>
#include <strstream>
#include <vector>
int main()
{
std::vector<float> v = {1.1, -3.4, 1/7.0};
std::ostrstream ss;
for(unsigned int i=0; i < v.size(); ++i)
ss << v[i] << ' ';
ss << std::ends;
const char* buffer = ss.str();
std::cout << buffer << '\n';
ss.freeze(false);
}
然而,我认为最干净(也是最快)的解决方案是boost.karma
#include <iostream>
#include <string>
#include <vector>
#include <boost/spirit/include/karma.hpp>
namespace karma = boost::spirit::karma;
int main()
{
std::vector<float> v = {1.1, -3.4, 1/7.0};
std::string s;
karma::generate(back_inserter(s), karma::double_ % ' ', v);
std::cout << s << '\n';
}
move(ss).str()
中做一些好的事情,但我不知道现在是否有任何实现。 - Marc Glisse