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

C++ 在检查有效输入时,为什么还要使用istream::ignore?,c++,windows,istream,C++,Windows,Istream,使用类似于以下内容的内容: 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'); } while(cou

使用类似于以下内容的内容:

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');
}
while(cout>foo))
{
cin.clear();
//请随意用(80,“\n”)来代替我的观点
cin.ignore(数值限制::max(),'\n');
}
然而,
cin.ignore(…)
似乎没有必要。为什么我不能直接使用
cin.sync()
?它比较短,不需要长度。它也更通用,因为无论输入缓冲区中是否有任何字符,它都将以同样的方式工作。我在使用
ignore
的同一个循环中测试了这一点,它的工作方式是相同的。然而,似乎每一个涉及此类输入验证的示例都使用
ignore
而不是
sync

当有更简单的替代方案时,使用
ignore
的原因是什么(如果有的话)

如果重要的话:
Windows
GCC

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

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

在ifstream上,
同步()
的效果由实现定义(根据C++11,§27.9.1.5/19)--不能保证它会做你想做的事(也不能保证它会做什么)。在一个典型的情况下,当且仅当流是行缓冲时,它大约相当于忽略(ignore),但如果流是无缓冲的,它可能不会做任何事情,如果流是完全缓冲的,它可能会做坏事。

在ifstream上,
sync()
的效果是由实现定义的(根据C++11,§27.9.1.5/19)——不能保证它会做你想做的事(也不能保证它会做什么)。在一个典型的情况下,当且仅当流是行缓冲的时,它将相当于忽略。但是如果流是无缓冲的,它可能不会做任何事情,如果流是完全缓冲的,它可能会做坏事。

总是定义实现,嗯。我想这将是一个很好的选择如果不是的话,就重新利用它。@chris:是的,如果它能可靠地做你想做的事情,那么它将是一个很好的候选者。:-)始终定义实现,嗯。我想如果不是这样的话,它将是一个很好的候选人。@chris:是的,如果它能可靠地做你想做的事,它将是一个很好的候选人,可以做你想做的事。:-)