【发布时间】:2019-04-01 17:20:51
【问题描述】:
我如何判断下一次对fgets(stdin, ...) 的调用是否会阻塞?换句话说,我如何判断stdin 缓冲区是否有换行符等待读取?
在 Unix 上,我知道我可以像这样使用 select():
fd_set reads;
FD_ZERO(&reads);
FD_SET(fileno(stdin), &reads);
int s = select(fileno(stdin)+1, &reads, 0, 0, 0);
if (s) {
//fgets is ready
}
但是,Windows 上的select() 仅适用于套接字,不适用于“stdin”,因此我无法使用它。
我还知道在 Unix 上我可以使用 poll()、ioctl(0, I_NREAD...),可能还有很多其他解决方案。这些都不适用于 Windows。
我试过kbhit() 和WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), ))。问题是这两个都表明只要敲击第一个键就可以输入。我需要知道整行是否可用,因为fgets() 会阻塞整行。
也许我的问题是 Unix shell 倾向于缓冲整个输入行,而 Windows 没有?
我应该只使用fgetc() 建立一个缓冲区,直到我看到换行符吗?
我进行了研究以寻找其他答案,但没有一个对我有用。他们要么使用 C++,而我需要 C 解决方案。或者他们专注于将fgets() 与套接字一起使用,而我需要将其与stdin 一起使用。
非常感谢任何帮助。谢谢!
【问题讨论】:
-
考虑在 Linux 上使用 GNU readline。它已在Readline-GW 中移植到 Windows
-
感谢 cmets,但我真的想在 Windows 上执行此操作。我也不能引入依赖项,但我会在以后的项目中记住这一点。
-
由于Readline-GW是免费软件,你可以研究它的源代码
标签: c windows io console-application