文字列ストリームに何かを入れるとき、実際の数を言ってみましょう。その文字列オブジェクトをcoutに挿入すると...何を見ているのでしょうか?
通常、私はいくつかの奇妙な番号を取得しています。これはメモリの場所ですか?ちょっと興味があるんだけど。
以下のコメントがヒットしたようですが、私がやろうとしていることは次のとおりです:
string stringIn;
stringstream holdBuff;
holdBuff << getline(cin, stringIn);
cout << holdBuff;
基本的に、stringInを挿入するとholdBuffがどのようになるかを確認しようとしていました。私はユーザーに文字列を入力してもらいたいのですが、それをステップスルーしてその内容を探して変換します...
どう思いますか
holdBuff << getline(cin, stringIn);
やっています。 getline
の戻り値の型は、この場合の読み取り中のストリーム(cin
)への参照です。 <<
を2番目の引数として取るstd::istream
が定義されていないため、コンパイラは異なる変換を試みます。C++ 11では、std::istream
はbool
への暗黙的な変換を持ちます。また、以前のC++では、std::ios*
への暗黙的な変換、または同様のもの(ただし、戻り値の唯一の有効な使用は、bool
に変換することです)。したがって、1
(C++ 11)またはランダムアドレス(実際には、通常はストリームのアドレスですが、これは保証されません)を出力します。 getline
への呼び出しの結果をstd::ostringstream
に取得するには、2つの操作が必要です(それらの間のエラーをチェックします):
if ( !getline( std::cin, stringIn ) )
// Error handling here...
holdBuff << stringIn;
同様に、std::ostringstream
の内容を書き込むには、
std::cout << holdBuf.str() ;
正しい解決策です。 std::stringstream
の方が適切な場合にstd::ostringstream
の使用を主張する場合は、次のこともできます。
std::cout << holdBuf.rdbuf();
ただし、最初の解決策は、はるかに慣用的であるため、好ましい方法です。
いずれの場合も、iostream
型をとる<<
演算子はないため、bool
またはポインターへの暗黙的な変換の結果になります。
はい、文字列ストリームのアドレスが表示される可能性があります。
含まれている文字列を表示する場合は、試してください
cout << stream.str();
はい、おそらく何らかの形のメモリの場所です。ほとんどの場合、stringstreamオブジェクト自体へのポインターです。
これは次のように確認できます。
std::stringstream ss;
unsigned long long ll = (unsigned long long)&ss;
cout << ll;
つまり、文字列ストリームを作成する場合は、次のようにstr()関数を使用する必要があります。
cout << ss.str();
cout << s.rdbuf();
あなたが望むものです。代わりに
count << s.str();
ただし、リソースの点でより高価になる場合があります。