我最近正在阅读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机器上运行。
我的问题是,这段代码可能与平台有关。