2013-02-13 41 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