如何通过使用C ++的stdin获取可用数据的大小

时间:2013-02-13 20:32:45

标签: c++ winapi console-application stdin

如果我从控制台应用程序中获取stdin句柄,请执行以下操作:

HANDLE hStdIn = ::GetStdHandle(STD_INPUT_HANDLE);

然后我可以从中读取数据:

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

我的问题是,在阅读之前,我怎么知道有多少字节可用?

PS。如果没有可供阅读的数据,ReadFile似乎会阻止。

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

对于控制台输入,您不知道用户或机器可以提供的字符 例如,我的程序要求您输入一个句子。你在想哪一句话?你会打哪一个?句子中有多少个字母?

如果你真的想知道,我强烈推荐阅读思想课程,或者非人类的输入,预测未来的课程。

对于文件,您可以检查大小。

答案 2 :(得分:1)

使用ReadConsoleInput读取原始输入事件,使用PeekConsoleInput检查它们,而无需从输入队列中删除。这里有一些警告:

  1. 您的标准输入可能会被重定向,然后您必须确定其类型并采取相应措施。如果它是一个文件,它将不会阻止,你只需继续阅读。如果它是管道,PeekNamedPipe会提供一些帮助。

  2. 输入事件和字符之间没有一对一的对应关系。

  3. 如果在控制台上设置了ENABLE_LINE_MODE,则ReadFile / ReadConsole会在没有输入换行符时阻止;此外,在您实际调用 ReadConsole之前,线路编辑工具不可用,当您拨打ReadConsole时,它将会阻止。

  4. 我建议在一个单独的线程中执行ReadFileReadConsole(或尝试后者回退到前者)。您的主线程可能会做一些有用的事情,并最终检查(或等待)阅读线程的准备情况。

答案 3 :(得分:0)

是的,你可以这样做,是的,它会坐在那里等待你的输入填充缓冲区。如果那不是你想要的,那就不要使用ReadFile。

还有其他用于读取控制台I / O的函数,包括那些为您提供待处理“事件”数量的函数。

Console IO functions