2013-02-13 69 views
0

標準輸入數據的大小。如果我從一個控制檯應用程序得到一個處理stdin像這樣:如何獲得可通使用C++

HANDLE hStdIn = ::GetStdHandle(STD_INPUT_HANDLE); 

然後我就可以從中讀取數據:

BYTE buff[32]; 
DWORD dwcbRead = 0; 
BOOL bReadRes = ::ReadFile(hStdIn, buff, SIZEOF(buff), &dwcbRead, NULL); 

我的問題是,在閱讀它們之前,我怎麼知道有多少字節可用?

PS。如果沒有可讀取的數據,ReadFile似乎會被阻止。

+0

不完全重複的問題。被引用的鏈接(另一個問題)只能解決部分問題,當stdin被重定向時。 Anton Kovalenko的回答告訴我們'PeekConsoleInput'可以用於控制檯標準輸入。我們應該結合這些答案。 – 2016-01-05 03:15:40

回答

1

使用ReadConsoleInput讀取原始輸入事件和PeekConsoleInput以檢查它們不從輸入隊列中刪除。這裏有一系列注意事項:

  1. 您的標準輸入可能會被重定向,那麼您必須確定其類型並採取相應措施。如果它是一個文件,它不會阻止,你只需繼續閱讀。如果是管道,PeekNamedPipe會提供一些幫助。

  2. 輸入事件和字符之間沒有一對一的對應關係。

  3. 如果在控制檯上設置了ENABLE_LINE_MODE,如果還沒有輸入換行符,則會阻止ReadFile/ReadConsole;另外,在您實際撥打致電ReadConsole以及撥打ReadConsole時,線路編輯功能將無法使用。

我建議做ReadFileReadConsole(或試圖回退到前者後者),在一個單獨的線程。你的主線程可能會做一些有用的事情,並最終檢查(或等待)讀線程的準備情況。

+0

好的信息。謝謝。 – ahmd0 2013-02-13 20:54:50

1
+0

哈哈。我自己看到了「PeekNamedPipe」,但是因爲它的名字我想,「沒辦法。」但是你會知道什麼。它似乎工作。雖然出於某種奇怪的原因,如果沒有輸入,它返回'FALSE','GetLastError'設置爲'ERROR_INVALID_HANDLE' ...嗯。 – ahmd0 2013-02-13 20:46:43

1

對於控制檯輸入,你不知道怎麼可能字符的用戶或機器將提供。
例如,我的程序會要求您輸入一個句子。你在想哪個句子?你會輸入哪一個?句子中有多少個字母?

如果你真的想知道,我強烈推薦一門課程來閱讀頭腦,或者從非人類的角度來預測未來。

對於一個文件,你可以檢查大小。

+0

我明白你的觀點。但是,你不正確。據稱,「PeekNamedPipe」可以根據Remy Lebeau的帖子爲您提供相關信息。 – ahmd0 2013-02-13 20:53:37

+0

@ ahmd0:哪個平臺? PeekNamedPipe是標準C++語言的一部分嗎?另外,PeekNamedPipe如何知道我打算輸入多少個字符?連我都不知道! – 2013-02-13 23:00:15

+0

我認爲'PeekNamedPipe'帶有新的Microsoft MRT ...(思維讀取技術)。所以它確實知道你會打字什麼,甚至在你做之前。 – ahmd0 2013-02-13 23:13:01

0

是的,你可以做到這一點,是的,它會坐在那裏等待你的輸入來填充緩衝區。如果這不是你想要的,那麼不要使用ReadFile。

還有其他功能是爲了閱讀控制檯I/O,包括給你一些未決的「事件」。

Console IO functions