[英]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.