【发布时间】:2019-12-12 13:53:50
【问题描述】:
我在循环中从字符串流中提取值,每次执行循环时都重置循环顶部的字符串流。但是,字符串流的>> 运算符每次都在第二次迭代中失败。这个代码的提炼版本重现了我遇到的问题:
istringstream word;
string in;
int number;
while(cin >> in) {
word.str(in);
//Uncommenting either one of the following lines seems to solve the issue:
//word.clear();
//word.seekg(0);
word >> number;
if(word.fail()) {
cerr << "Failed to read int" << endl;
return 1;
}
cout << in << ' ' << number << endl;
}
就目前而言,它总是在第二次循环迭代时失败。但是,取消注释两行代码中的任何一行都可以解决问题。我不明白的是,既然我已经用word.str(in) 重置了字符串流,为什么它仍然失败?为什么重置获取位置可以解决问题?
我是否遗漏了有关字符串流的工作原理的信息?它是否在最后一次有效读取而不是由于 EOF 而失败的读取上设置了eofbit 标志?如果是这样,为什么seekg(0) 似乎清除了该标志,而重置字符串流却没有?
【问题讨论】:
-
既然你只在循环内使用
word,为什么不在循环范围内(即循环内)定义它呢?一个好的经验法则是在尽可能接近其使用点的地方定义变量(这意味着您也应该在阅读之前定义number)。 -
可能重复:C++ - repeatedly using istringstream(调用
word.str()不会重置 iostatus 位) -
我相信它只是在缓冲区上调用
str(s),不确定所有具有 en.cppreference.com/w/cpp/io/basic_stringbuf/str 的效果。可能错误标志与缓冲区完全分开,但我不确定。 -
@Adrian-ReinstateMonica 我认为“你需要打电话给
clear()”和“为什么我必须打电话给clear?”是有区别的。 OP 有clear()/working 解决方案。 -
@FireLancer 这就是为什么我说可能重复! ??????
标签: c++ stringstream