web-dev-qa-db-ja.com

cout << stringstream

文字列ストリームに何かを入れるとき、実際の数を言ってみましょう。その文字列オブジェクトをcoutに挿入すると...何を見ているのでしょうか?

通常、私はいくつかの奇妙な番号を取得しています。これはメモリの場所ですか?ちょっと興味があるんだけど。

以下のコメントがヒットしたようですが、私がやろうとしていることは次のとおりです:

string stringIn; 
stringstream holdBuff;
holdBuff << getline(cin, stringIn);
cout << holdBuff; 

基本的に、stringInを挿入するとholdBuffがどのようになるかを確認しようとしていました。私はユーザーに文字列を入力してもらいたいのですが、それをステップスルーしてその内容を探して変換します...

19
MCP

どう思いますか

holdBuff << getline(cin, stringIn);

やっています。 getlineの戻り値の型は、この場合の読み取り中のストリーム(cin)への参照です。 <<を2番目の引数として取るstd::istreamが定義されていないため、コンパイラは異なる変換を試みます。C++ 11では、std::istreamboolへの暗黙的な変換を持ちます。また、以前の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またはポインターへの暗黙的な変換の結果になります。

22
James Kanze

はい、文字列ストリームのアドレスが表示される可能性があります。

含まれている文字列を表示する場合は、試してください

cout << stream.str();
21
Bo Persson

はい、おそらく何らかの形のメモリの場所です。ほとんどの場合、stringstreamオブジェクト自体へのポインターです。

これは次のように確認できます。

std::stringstream ss;
unsigned long long ll = (unsigned long long)&ss;
cout << ll;

つまり、文字列ストリームを作成する場合は、次のようにstr()関数を使用する必要があります。

cout << ss.str();
6
Goz
cout << s.rdbuf();

あなたが望むものです。代わりに

count << s.str();

ただし、リソースの点でより高価になる場合があります。