私は主にostream_iteratorを使ってC++でtoStringメソッドを実装しています。出力をostream_iteratorから文字列に変換するにはどうすればよいですか?
std::ostream_iterator<int> output(std::cout, " ");
しかし、コンソールに印刷した後、ostream_iteratorの出力を文字列として返したいとします。この直接変換は可能ですか?
私は主にostream_iteratorを使ってC++でtoStringメソッドを実装しています。出力をostream_iteratorから文字列に変換するにはどうすればよいですか?
std::ostream_iterator<int> output(std::cout, " ");
しかし、コンソールに印刷した後、ostream_iteratorの出力を文字列として返したいとします。この直接変換は可能ですか?
この直接変換は可能ですか?
先はあなたが戻ってデータを取得するために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;
:
は、簡単な例を考えてみましょう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つを使用できます。
はい、単にcoutをstringstreamに置き換えて、文字列を作成することができます。
std::stringstream ss; // #include <sstream>
std::ostream_iterator<int> output(ss, " ");
std::string s(ss.str());
いいえ、 'cout'ではなくstringstreamへの出力のようにする必要があります。 –
はい。私の答えのサンプルコード。 – Davislor