我正在尝试检测 Ctrl + D 用户输入,我知道它返回EOF
。现在,我知道代码等待来自stdin流的输入,但有没有办法让程序继续,直到 Ctrl + D 命令在stdin中?如果未输入 Ctrl + D ,程序应继续运行if语句。
char buffer[];
if (fgets(buffer, 10, stdin) == NULL{
//write to file
}
答案 0 :(得分:3)
当用户按 Ctrl + D 时,您想要停止程序吗?但是你不想阅读 stdin ?如果这是真的,您应该考虑 Ctrl + C 的处理程序是否是更好的解决方案。但首先我会写一些关于非阻塞I / O的内容,因为这是你要求的。
在 C 中没有标准的方法来实现非阻塞I / O.但是您可以将{em> POSIX - 函数(例如select
或fcntl
与read
结合使用)。 StackOverflow上还有其他一些问题。例如This question。
如果你想处理 Ctrl + C ,你可以使用signal
做这样的事情:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
volatile bool shouldRun = true;
void sighandler(int) {
shouldRun = false;
}
int main(int argc, char *argv[]) {
if (signal(SIGINT, &sighandler) == SIG_ERR) {
fprintf(stderr, "Could not set signal handler\n");
return EXIT_FAILURE;
}
printf("Program started\n");
while (shouldRun) {
// Do something...
}
printf("Program is shutting down.\n");
return EXIT_SUCCESS;
}
答案 1 :(得分:2)
由于机器在 Ctrl + D 上生成EOF
,您应该fgets()
检查NULL
,{{{ 1}}必须在文件末尾返回fgets()
。
NULL
答案 2 :(得分:0)
在这里发帖太多了,你并不具体说明你现在和你想要什么。所以这里给出了如何做到这一点的一般概念:
在程序中添加信号处理程序
如果您只想在输入C-d时终止程序,只需在步骤2中发送SIGKILL并忽略第3步。
如果您不知道上述任何条款,Google就是您的朋友
答案 3 :(得分:0)
在大多数操作系统上,stdin一次缓冲一行,并且任何读取它的尝试(不会进入低级别的恶意)将停止,直到行或EOF可用。如果您不介意这一点,并且只想在不读取任何等待输入的情况下检查EOF,如果EOF不存在,您可以使用ungetc:
search = input("Enter keyword(s) here:")
你只能保证来自ungetc的一个回退角色,尽管大多数实现都会给你更多。只有当你以后不去寻找流时(stdin的情况就是这样)它才有效。另请注意,我正在调用它&#34;字节键入&#34;,而不是&#34;字符类型&#34 ;:例如,中文,日文和韩文字符不适合大多数C实现的char类型,并且它取决于控制台在您键入时如何对它们进行编码(如果您设置了CJK输入法或者可以复制/粘贴一些,您可以在上面的程序中尝试并查看)。