簡體   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