失败的istream丢弃令牌?

时间:2017-03-26 23:44:04

标签: c++ c++11

我最近正在阅读C ++教科书(Accelerated C++),作者想要读取表格的输入数据:

name1 double double double double ... 
name2 double double double double ...
                    ^ all doubles from here on out will go into a vector

作者的想法是做一些类似于从cin读取的内容,直到流失败,这样做会因为输入完成,或者因为我们尝试读取name2作为double将把流放入失败的状态。关于这一点,他说

  

在任何一种情况下,我们都想假装从未看过上一个作业成绩之后的任何内容。这样的借口变得容易:如果我们遇到了不是等级的东西,那么库会让它在下次输入尝试时未读取。因此,我们需要做的就是告诉库忽略输入尝试失败的任何条件,无论是eof还是无效输入。

我的问题与粗体部分有关。作者似乎暗示从cin读取失败的尝试不会丢弃它失败的令牌,而是将其留在流中。但是,我写了一个程序来测试这个,但事实似乎并非如此:

输入数据(为简单起见,我将它全部放在一行上):

p1 90 91 92 93 94 p2 81 82 83 84 85

程序:

using std::cout;    using std::cin;
using std::endl;    using std::string;

int main() {

    while(cin) {
        string name, midterm, final;
        cin >> name >> midterm >> final;
        double x;
        cout << endl <<  "Name: " << name
             << ", Mid: " << midterm
             << ", Final: " << final << "\t"
             << "Homework: {";
        while(cin >> x) {
            std::cout << x << ", ";
        }
        cout << "}" << endl;

        if(cin.fail()) {
            cin.clear();
            string f;
            cin >> f;
            cout << "Stream failed - next token: "  << f << endl;
        }
    }

}

输出:

Name: p1, Mid: 90, Final: 91    Homework: {92, 93, 94, }
Stream failed - next token: 81

Name: 82, Mid: 83, Final: 84    Homework: {85,  

修改

这似乎是机器特定的事情;特别是Mac问题。我尝试在另一台Linux和Mac机器上运行代码,它在Linux机器上运行但在Mac机器上运行。

我的问题是,这段代码可能与平台有关。

0 个答案:

没有答案