3

私の cpp プログラムは、文字列ストリームを使用すると、スコーピングに関して奇妙なことをしています。文字列と文字列ストリームの初期化を使用する場所と同じブロックに配置すると、問題はありません。しかし、1ブロック上に配置すると、文字列ストリームは文字列を正しく出力しません

正しい動作である場合、プログラムは空白で区切られた各トークンを出力します。

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main () {

    while (true){
        //SAME BLOCK
        stringstream line;
        string commentOrLine;
        string almostToken;
        getline(cin,commentOrLine);
        if (!cin.good()) {
            break;
        }
        line << commentOrLine;
        do{

            line >> almostToken;
            cout << almostToken << " ";
        } while (line);
        cout << endl;
    }
    return 0;
}

不適切な動作: プログラムは最初の入力行のみを出力します。

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main () {
    //DIFFERENT BLOCK
    stringstream line;
    string commentOrLine;
    string almostToken;
    while (true){
        getline(cin,commentOrLine);
        if (!cin.good()) {
            break;
        }
        line << commentOrLine;
        do{

            line >> almostToken;
            cout << almostToken << " ";
        } while (line);
        cout << endl;
    }
    return 0;
}

なぜこれが起こるのですか?

4

1 に答える 1

7

stringstreamfor each 行を「作成して破棄」すると、fail状態もリセットされます。

line.clear();新しいコンテンツを に追加する直前に追加することで、これを修正できますline

于 2013-06-20T14:28:36.360 に答える