如何将ostream_iterator的输出转换为字符串?

时间:2017-04-03 04:27:18

标签: c++ string iterator ostream

我主要使用ostream_iterator在C ++中实现一个toString方法。

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

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

3 个答案:

答案 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容器一样。

如果您只想将一堆数据存储在内存中,并且要将其发送到输出迭代器和字符串,则可以使用其他构造函数之一。