7

stringstream を繰り返し使用して文字列に追加できるかどうかを確認する短いテストプログラムを作成しました。

最初のバージョンでは Output1 を取得しましたが、s1 が空のままである理由がよくわかりません。ss.clear() を実行してから、Output2 で期待される結果を取得する必要があることがわかりました。明確にしないと機能しない理由を誰か説明できますか? 数値を繰り返し入力して文字列に戻すと、常に数値が取得されるはずです。番号が追加されるかどうかはわかりませんでしたが、それはこの例の要点ではありません。

ここ:http://www.cplusplus.com/reference/sstream/stringstream/任意の操作を使用できると書かれており、文字列をリセットするための制限や要件はありません。また、後で ss.clear() を介さずに出力を取得する理由もわかりません。

また、その後 s0 が変わらないことに少し驚いています。コンテンツが既にある場合、ストリームは文字列を上書きまたはリセットしませんか?

私はcygwinでgcc 3.4.4を使用しています。

int main()
{
    std::string s0;
    std::string s1;
    int n = 1;
    std::stringstream ss;
    ss << n;
    ss >> s0;
    cout << "S0:" << s0 << endl;
    ss.clear();     <-- If I remove this, then s1 stays empty.
    n = 2;
    ss << n;
    ss >> s1;
    cout << "S1:" << s1 << endl;
    ss << n;
    ss >> s0;
    cout << "S0_2:" << s0 << endl;    <-- Why is s0 still 1?
 }

出力 1:

S0:1
S1:
S0_2:1

出力 2:

S0:1
S1:2
S0_2:1
4

1 に答える 1

5

に読み込まれた後s0、ストリームは EOF 状態になります。そのため、EOF 状態がクリアされない限り、次の読み取りは失敗します。ストリームに書き込んでも、読み取り状態はクリアされません。


答えを完成させるためだけに編集してください。この動作は、ストリームが入力シーケンスの最後にある場合、ストリームの状態にこのビットが設定されるというの定義eofbitに 由来します。ios_base::iostate

プログラムの最初のバージョンでは、 への最初の読み取り後に EOF 状態がクリアされs0ないため、2 回目の読み取りも 3 回目の読み取りも成功しません。したがって、失敗した最初の読み取りはs1空のままになり、失敗した 2 番目の読み取りはs0変更されません。

プログラムの 2 番目のバージョンではss、最初の への読み込みの後にクリアしs0、2 番目の への読み込みs1を成功させます。ただし、2 回目の読み取りの後、ストリームは再び EOF 状態になるため、3 回目の読み取りは失敗します。これはs0変更されません。

于 2013-05-08T14:26:27.470 に答える