如果我从控制台应用程序中获取stdin
句柄,请执行以下操作:
HANDLE hStdIn = ::GetStdHandle(STD_INPUT_HANDLE);
然后我可以从中读取数据:
BYTE buff[32];
DWORD dwcbRead = 0;
BOOL bReadRes = ::ReadFile(hStdIn, buff, SIZEOF(buff), &dwcbRead, NULL);
我的问题是,在阅读之前,我怎么知道有多少字节可用?
PS。如果没有可供阅读的数据,ReadFile
似乎会阻止。
答案 0 :(得分:1)
答案 1 :(得分:1)
对于控制台输入,您不知道用户或机器可以提供的字符 例如,我的程序要求您输入一个句子。你在想哪一句话?你会打哪一个?句子中有多少个字母?
如果你真的想知道,我强烈推荐阅读思想课程,或者非人类的输入,预测未来的课程。
对于文件,您可以检查大小。
答案 2 :(得分:1)
使用ReadConsoleInput
读取原始输入事件,使用PeekConsoleInput
检查它们,而无需从输入队列中删除。这里有一些警告:
您的标准输入可能会被重定向,然后您必须确定其类型并采取相应措施。如果它是一个文件,它将不会阻止,你只需继续阅读。如果它是管道,PeekNamedPipe
会提供一些帮助。
输入事件和字符之间没有一对一的对应关系。
如果在控制台上设置了ENABLE_LINE_MODE
,则ReadFile
/ ReadConsole
会在没有输入换行符时阻止;此外,在您实际调用 ReadConsole
之前,线路编辑工具不可用,当您拨打ReadConsole
时,它将会阻止。
我建议在一个单独的线程中执行ReadFile
或ReadConsole
(或尝试后者回退到前者)。您的主线程可能会做一些有用的事情,并最终检查(或等待)阅读线程的准备情况。
答案 3 :(得分:0)
是的,你可以这样做,是的,它会坐在那里等待你的输入填充缓冲区。如果那不是你想要的,那就不要使用ReadFile。
还有其他用于读取控制台I / O的函数,包括那些为您提供待处理“事件”数量的函数。