繁体   English   中英

为什么在检查有效输入时我还要使用 istream::ignore?

[英]Why would I even use istream::ignore when checking for valid input?

parashift 上的 C++ 常见问题解答使用类似于以下内容的内容:

while (cout << "Enter an integer: " && !(cin >> foo))
{
    cin.clear();

    //feel free to replace this with just (80, '\n') for my point
    cin.ignore (numeric_limits<streamsize>::max(), '\n');
}

然而, cin.ignore (...)似乎是不必要的。 为什么我不能只使用cin.sync() 它更短,不需要长度。 它也更加通用,因为无论输入缓冲区中是否有任何字符,它都会以相同的方式工作。 我在与ignore一起使用的同一循环中测试过一次,它的工作方式相同。 然而,似乎每个涉及此类输入验证的示例都使用ignore而不是sync

当有更简单的选择时,使用ignore的原因是什么(如果有的话)?

如果重要:
Windows
GCC
MinGW

在 ifstream 上, sync()的效果是实现定义的(根据 C++11,§27.9.1.5/19)——不能保证它会做你想做的事(也不能真正保证它会做什么) ). 在典型情况下,当且仅当 stream 是行缓冲时,它大约等同于ignore ——但如果 stream 是无缓冲的,它可能不会做任何事情,如果 stream 是完全缓冲的,它会可能会做坏事。

两者做不同的事情。 sync丢弃已经预读的字符,无论有多少,或者它们是什么。 另一方面, ignore丢弃字符直到遇到某个字符,无论这些字符是否已经被读取,或者是否有更多的字符已经提前读取。 例如,假设cin有一个 40 字节的缓冲区,但您的行有 80 个字节。 那么很可能前 40 个字节已被读取到cin的缓冲区。 在您解释了这些开头之后,通过调用sync可以丢弃您已经阅读的那 40 个字符中的 rest,但不会丢弃该行中的其他 40 个字符。 另一方面,您的输入可能来自 pipe,其中通常不进行行缓冲。 在这种情况下,您不仅可以丢弃当前行,还可以丢弃已提前阅读的下一行的部分内容。 OTOH with ignore你总是知道你总是会读到下一个\n (假设要忽略的最大字符数足以遇到它)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM