2017-05-24 21 views
1

istream::peek操作被阻止似乎已被接受。C++ istream :: peek - 不應該是非阻塞嗎?

該標準雖然可以說有點模糊,但傾向於非阻塞行爲。 peek呼叫sgetc反過來,其行爲是:

「的字符以所控制的輸入序列的當前位置,如 的int類型的值。如果沒有更多的字符從受控輸入序列閱讀,該函數返回文件結束值(EOF)。「

這並不是說「如果沒有更多的字符.......等到有」

我在這裏失去了一些東西?或者我們使用的peek實現有點不對?

+1

您引用的文本不是C++標準的一部分 –

+0

引自http://www.cplusplus.com/reference/streambuf/streambuf/sgetc/。 http://www.cplusplus.com/reference/streambuf/basic_streambuf/sgetc/以及http://en.cppreference.com/w/cpp/io/basic_streambuf/underflow上的類似文檔。你是說這些不準確嗎? – Malachi

+1

cpluscplus.com是一個垃圾網站。您提供的cppreference鏈接不包含您問題中的文字。實際上它說:「通過[...確保輸入區域中至少有一個字符可用]從輸入序列中讀取更多數據(如果適用)。「在這種情況下適用哪種方式,並且」從輸入序列讀取數據「需要等待更多的數據(如果沒有數據並且數據流不在EOF或其他數據中)錯誤狀態 –

回答

2

從cppreference.com的描述可能是一個比你更清楚的問題:

確保至少一個字符,請在輸入區的[...]閱讀從更多的數據輸入序列(如果適用的話)「

‘如果適用’不適用在這種情況下;及‘從輸入序列’讀取數據需要等待更多的數據,如果是沒有的並且流未處於EOF或其他錯誤狀態

4

受控輸入序列是您正在讀取的文件(或其他)。所以如果你在文件末尾,它會返回EOF。否則,它將返回文件中的下一個字符。

我在這裏什麼也看不到,根本不明確 - 如果它需要一個沒有從文件中讀取的字符,那麼它需要讀取它(並等待它被讀取並返回)。

如果您正在讀取類似套接字的內容,那麼它將等待數據到達(或網絡堆棧檢測到EOF,例如對等斷開連接)。

+0

「等待」一詞從未出現在我鏈接的任何規格中。但是,您對EOF的評論暗示一旦收到EOF,應該基本不會期待在EOF上有更多的數據嗎?這是你對EOF的期望嗎? – Malachi

+0

在閱讀MM的評論之後,「確保」一詞似乎非常暗示了一個等待操作所有... – Malachi

2

當我對控制檯輸入感到困惑時,我提醒自己可以將控制檯輸入重定向爲來自文件,因此鍵盤的行爲或多或少地模仿文件的行爲。當你嘗試從文件中讀取一個字符時,你可以得到以下兩個結果之一:你得到一個字符,或者你得到了EOF,因爲你已經到達了文件的末尾 - 沒有更多的字符可以被讀取。鍵盤輸入也是如此:無論是獲取角色,還是獲得EOF,因爲您已經到達文件末尾。對於一個文件,沒有等待更多字符的概念:一個文件有未讀字符或者沒有。鍵盤也一樣。所以如果你沒有到達鍵盤上的EOF,讀一個字符就會返回下一個字符。通過輸入系統識別爲EOF的任何字符,可以在鍵盤上到達EOF;在Windows上的ctrl-D的Unix系統上(如果我沒記錯的話)就是ctrl-C。如果您還沒有達到EOF,則需要讀取更多字符。

+0

是的,這個問答已經告訴我,我以錯誤的方式思考EOF。謝謝您的意見 – Malachi