在C语言中将stdin设置为文件时如何从键盘读取数据

在C语言中将stdin设置为文件时如何从键盘读取数据,c,file,stream,keyboard,stdin,C,File,Stream,Keyboard,Stdin,我认为这很简单,但对我来说显然不是 我有一个控制台应用程序。我需要从键盘读取输入,但stdin已重定向到文件。那么,如何创建指向键盘流的文件句柄,我可以使用fgets等 我发现ttyname(0)似乎是我在POSIX环境中寻找的东西,我在这里没有。我在Windows系统中使用标准的Visual Studio编译器 有什么想法吗?提前感谢您。从DOS编程的黑暗岁月中走出来:尝试打开“CON:”(控制台),这是一个保留字。希望它能在Windows中以同样的方式打开。可能需要也可能不需要冒号。“dir

我认为这很简单,但对我来说显然不是

我有一个控制台应用程序。我需要从键盘读取输入,但
stdin
已重定向到文件。那么,如何创建指向键盘流的文件句柄,我可以使用
fgets

我发现
ttyname(0)
似乎是我在POSIX环境中寻找的东西,我在这里没有。我在Windows系统中使用标准的Visual Studio编译器


有什么想法吗?提前感谢您。

从DOS编程的黑暗岁月中走出来:尝试打开“CON:”(控制台),这是一个保留字。希望它能在Windows中以同样的方式打开。可能需要也可能不需要冒号。“dir>con:”和“dir>con”仍在命令提示符下工作

另外,请确保在输出句柄上使用setbuf()族中的某些内容,以避免缓冲。。。它不应该缓冲终端I/O,但肯定不会有什么坏处


同样,我也不确定,但我怀疑,如果您在一个句柄同时进行输入和输出时遇到问题,那么打开单独的
文件*conin、*conout
进行输出和一个进行输入可能会有所帮助。

没有简单/便携的方法来判断键盘是否存在(您的应用程序可能是通过串行端口、telnet会话或其他任何方式从终端仿真器运行的)。如果键盘确实存在(包括触摸屏上的键盘图片),那么您就无法真正知道按键需要经过多少层软件才能进入您的应用程序(例如,击键可能从键盘驱动程序到输入法编辑器,再到GUI,再到应用程序的外壳)。这意味着,尝试直接从键盘驱动程序或其他地方获取击键是一个坏主意,几乎在所有情况下都会失败

解决问题的最佳方法是找出导致STDIN被重定向的一系列设计失败


例如,也许应用程序应该有一个命令行选项来从文件中读取一些数据;这样应用程序就可以从文件中获取一些数据,从STDIN获取一些数据(如果命令行选项不存在,则从STDIN获取所有数据)
ttyname
函数在POSIX环境中不会有帮助,因为当输入来自管道或重定向文件时,它将返回
NULL
stdin已重定向到文件。
-为什么不
fclose
文件指针和
freopen
stdin到新文件。完成后,again将stdin重定向到旧文件。在某种程度上,这就是我想做的nav_jan,但是如果我不知道控制台的路径,我就不能使用
fopen
freopen
打开它。如果我有那个路径,我就不需要重定向
stdin
。我可以创建另一个键盘输入句柄,并使用文件和键盘输入独立思考。但是谢谢你的想法。