C++ istream 输入失败但消耗数据。期望在失败后能够读取坏数据

C++ istream input fails yet consumes data. Expected to be able read bad data after failure

我对iostream的理解一直是,当一个输入转换失败时,清除错误后,数据仍然留在流中以供读取。但是我有一个例子并不总是那样工作,我想知道这种行为是否正确。如果是这样,有人可以指点我一些关于实际规则的好文档吗?

这个小程序代表了使用i/o失败来读取一个可选的重复计数和一个字符串的想法。

#include <iostream>
#include <string>

int main()
{
    int cnt;
    std::cout << "in: ";
    std::cin >> cnt;
    if(!std::cin) {
        cnt = 1;
        std::cin.clear();
    }
    std::string s;
    std::cin >> s;
    std::cout << "out: " << cnt << " [" << s << "]" << std::endl;
}

所以,它是这样运行的:

[me@localhost tmp]$ ./bother 
in: 16 boxes
out: 16 [boxes]
[me@localhost tmp]$ ./bother 
in: hatrack
out: 1 [hatrack]
[me@localhost tmp]$ ./bother 
in: some things
out: 1 [some]
[me@localhost tmp]$ ./bother 
in: 23miles
out: 23 [miles]
[me@localhost tmp]$ ./bother 
in: @(#&$(@#&$ computer
out: 1 [@(#&$(@#&$]

所以它大部分都有效。当先有一个数字时,它被读取,然后是字符串。当我先给出一个非数字时,读取失败,计数设置为 1 并读取非数字输入。但这中断了:

[me@localhost tmp]$ ./bother 
in: + smith
out: 1 [smith]

+ 无法读取整数,因为它不足以构成一个数字,但 + 不会保留在流中以供读取的字符串拾取。同样与 - 。如果它读取 + 或 - 为零,那将是合理的,但读取应该成功并且 cnt 应该显示零。

也许这是正确的行为,而我一直对它应该做的事情有误。如果是这样, 规则是什么?

感谢您的建议。

加号和减号是整数的有效部分,因此被读取,当读取下一个字符时,流失败并且该字符留在流中但前导符号字符不会放回流中。

有关完整规则,请参阅 https://en.cppreference.com/w/cpp/locale/num_get/get