我主要使用ostream_iterator在C ++中实现一个toString方法。
std::ostream_iterator<int> output(std::cout, " ");
然后,打印到控制台后,我希望将ostream_iterator的输出作为字符串返回。这可以直接转换吗?
答案 0 :(得分:2)
这可以直接转换吗?
我认为,不,因为ostream_iterator
用于以一种方式发送数据,因此如果目标是std::cout
,则无法使用ostream_iterator
来获取数据。
但您可以使用其他目的地,例如ostringstream
对象,然后通过cout
将其用于输出,并根据需要再次使用。
考虑简单的例子:
std::stringstream buff;
std::ostream_iterator<int> output(buff, " ");
std::istringstream str("10 3 ABC 7 1");
// just copy only first integer values from str (stop on the first non-integer)
std::copy(std::istream_iterator<int>(str), std::istream_iterator<int>(), output);
// output as a string to std output
std::cout << buff.str() << std::endl;
// do something else
buff.seekp(0, std::ios::end);
std::cout << "String size is " << buff.tellp() << std::endl;
答案 1 :(得分:2)
是的,只需用stringstream替换cout,就可以从中创建字符串。
std::stringstream ss; // #include <sstream>
std::ostream_iterator<int> output(ss, " ");
std::string s(ss.str());
答案 2 :(得分:0)
如果你想要一个使用std::ostream
接口而不是STL容器接口的字符串式对象,那就是std::stringstream
,或者不推荐使用std::strstream
最接近通用包装器的对象将cout <<
中可以序列化的任何内容转换为std::string
,即可写入std::stringstream
,然后将数据读回。然而,这将最终制作至少一个昂贵的副本。这是一个实现:
#include <cstdlib>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
using std::cout;
using std::endl;
using isit = std::istream_iterator<char>;
template <typename T> std::string to_string(const T& x)
// Must be able to print a T with std::ostream::operator<<.
{
std::stringstream buffer;
buffer << x;
const isit begin(buffer); // The start of the stream object.
static const isit end; // Default object is the end-of-stream iterator.
return std::string( begin, end );
}
int main(void)
{
const std::string output_string = to_string("Testing:") + " " +
to_string(1) + ", " + to_string(2ULL) + ", " + to_string(3.0) +
to_string('.');
cout << output_string << endl;
return EXIT_SUCCESS;
}
您可以使用std::ostream_iterator<char>
写入std::stringstream
,而不是<<
,然后使用std::istream_iterator<char>
,如图所示,从中复制到字符串。
您可以使用std::istream
将数据从std::string
写入std::istream_iterator
。有点。格式化可能很糟糕。
如果要使用迭代器从std::string
读取数据,则其迭代器类型为std::string::iterator
,字符串前面的迭代器为s.begin()
,与其他STL容器一样。
如果您只想将一堆数据存储在内存中,并且要将其发送到输出迭代器和字符串,则可以使用其他构造函数之一。