getline在下一次迭代中不执行

时间:2019-01-25 16:28:02

标签: c++ getline stringstream

我想标记输入中的所有单词。

#include <iostream>
#include <vector>
#include <sstream>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    string line,word;
    stringstream ss;
    while (1) {
        getline(cin,line);
        if (line=="#") break;
        ss.str(line);
        cout << "Stringstream string: " << ss.str() << endl;
        while (getline(ss,word,' ')) {
            if (word.size()>0) cout << word << endl;
        }
        cout << "Last Word: " << word << endl;
    }
    return 0;
}

但是当我对下面的输入执行上面的代码时,getline在下一次迭代中不起作用:

ladder came tape soon leader acme RIDE lone Dreis peat
ScAlE orb eye Rides dealer NotE derail LaCeS drIed
noel dire Disk mace Rob dries
#

2 个答案:

答案 0 :(得分:0)

如果仅为输入的每一行创建一个新的字符串流,则不必担心其状态或到达输入结束后清除任何标志:

#include <iostream>
#include <vector>
#include <sstream>

using namespace std;

int main()
{
    string line;
    while (getline(cin,line)) {
        if (line=="#") break;
        stringstream ss(line);
        cout << "Stringstream string: " << ss.str() << '\n';
        string word;
        while (getline(ss,word,' ')) {
            if (word.size()>0) cout << word << '\n';
        }
        cout << "Last Word: " << word << '\n';
    }
    return 0;
}

在您的代码中,所有行都使用相同的字符串流,但是在第一行ss的末尾已到达输入结尾,并且变得无用,从而拒绝执行任何操作。

答案 1 :(得分:-1)

您正在阅读,直到设置了ss.eofss.str不会取消设置它,因此ss.eof会在第一次迭代后保持设置状态。

#include <iostream>
#include <vector>
#include <sstream>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    string line,word;
    stringstream ss;
    while (1) {
        getline(cin,line);
        if (line=="#") break;
        ss.clear();
        ss.str(line);
        cout << "Stringstream string: " << ss.str() << endl;
        while (getline(ss,word,' ')) {
            if (word.size()>0) cout << word << endl;
        }
        cout << "Last Word: " << word << endl;
    }
    return 0;
}

使用clear可以取消设置标志。