在cpp奇怪的范围

时间:2013-06-20 14:21:52

标签: c++ scoping

当我使用字符串流时,我的cpp程序正在做一些奇怪的操作。当我将字符串和字符串流的初始化放在与我使用它的块相同的块中时,没有问题。但是如果我将它放在上面的一个块中,字符串流就不能正确输出字符串

正确的行为,程序打印由空格分隔的每个标记:

#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;
}

为什么会这样?

1 个答案:

答案 0 :(得分:7)

当你为每一行“创建并销毁”stringstream时,它也会重置fail状态。

您可以在将新内容添加到line.clear();之前添加line来解决此问题。