2017-04-03 36 views
0

我在C++中实现了一个toString方法,主要是使用ostream_iterator。如何将ostream_iterator的输出转换为字符串?

std::ostream_iterator<int> output(std::cout, " "); 

但是,打印到控制台后,我希望将ostream_iterator的输出作为字符串返回。这种直接转换可能吗?

+0

不,你需要做一些像输出到stringstream而不是'cout' –

+0

是的。示例代码在我的答案。 – Davislor

回答

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; 
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_iterator将数据从std::istream写入std::string。有点。格式可以是不可靠的。

如果要使用迭代器从std::string读取数据,则其迭代器类型为std::string::iterator,并且与其他STL容器一样,该字符串前面的迭代器为s.begin()

如果你只是有一堆数据存储在你想发送到输出迭代器和字符串的内存中,你可以使用它的其他构造函数之一。

1

是的,只需用stringstream替换cout,就可以从中创建字符串。

std::stringstream ss; // #include <sstream> 
std::ostream_iterator<int> output(ss, " "); 
std::string s(ss.str());