2017-04-03 20 views
0

私は主にostream_iteratorを使ってC++でtoStringメソッドを実装しています。出力をostream_iteratorから文字列に変換するにはどうすればよいですか?

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

しかし、コンソールに印刷した後、ostream_iteratorの出力を文字列として返したいとします。この直接変換は可能ですか?

+0

いいえ、 'cout'ではなくstringstreamへの出力のようにする必要があります。 –

+0

はい。私の答えのサンプルコード。 – Davislor

答えて

2

この直接変換は可能ですか?

先はあなたが戻ってデータを取得するためにostream_iteratorを使用することはできませんstd::coutあるので、もしostream_iteratorは、一つの方法をスト​​リーミングするためにデータを送信するために使用されているので、私は、ない、と思います。

しかし、他の目的地を使用することもできます。 ostringstreamオブジェクトを作成し、両方の出力にcoutまで使用し、好きなように再度使用します。あなたはむしろSTLコンテナのインターフェイスよりもstd::ostreamインターフェイスを使用して文字列のようなオブジェクトが必要な場合、それはstd::stringstream、またはその汎用ラッパーに廃止予定std::strstream最も近いものだ

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

は、簡単な例を考えてみましょうcout <<でシリアライズできるものをstd::stringに変換すると、std::stringstreamに書き込んでデータを読み取ることになります。これは、しかし、少なくとも1つの高価なコピーを作ることになります。ここでは実装です:

#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::stringstreamに書き込み、その後、std::istream_iterator<char>するstd::ostream_iterator<char>を使用することができます。

std::istreamからstd::stringにデータを書き込むことができます。std::istream_iteratorです。並べ替え書式設定が不安定になる可能性があります。

イテレータを使用してstd::stringからデータを読みたい場合は、そのイテレータ型はstd::string::iteratorで、文字列の前にイテレータは他のSTLコンテナのように、s.begin()です。

出力イテレータと文字列の両方に送信するたくさんのデータがメモリに格納されている場合は、他のコンストラクタの1つを使用できます。

1

はい、単にcoutをstringstreamに置き換えて、文字列を作成することができます。

std::stringstream ss; // #include <sstream> 
std::ostream_iterator<int> output(ss, " "); 
std::string s(ss.str()); 
関連する問題