1

parashift 上的C++ FAQ使用类似于以下内容的内容:

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

4

2 回答 2

3

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

于 2012-04-11T00:19:12.913 回答
1

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

于 2012-04-11T00:13:00.390 回答