如何在C语言中当stdin被设置为一个文件时从键盘读取输入

4
我认为这很简单,但显然对我来说不是这样!我有一个控制台应用程序。我需要从键盘读取输入,但是stdin已被重定向到一个文件。那么我该如何创建一个指向键盘流的FILE-Handle,以便可以在fgets等函数中使用它?我发现在POSIX环境中,ttyname(0)似乎是我要找的内容,但我在这里没有它。我在一个带有标准Visual Studio编译器的Windows系统中。有任何想法吗?提前感谢您。

“ttyname”函数在POSIX环境下无法发挥作用,因为当输入来自管道或重定向文件时,它会返回“NULL”。 - Some programmer dude
“stdin已被重定向到文件。” - 为什么不关闭该文件指针并将stdin重新定向到新文件。完成后,再次将stdin重定向到旧文件。 - nav_jan
在某种程度上,这正是我想要做的nav_jan,但如果我不知道控制台的路径,我就无法使用fopenfreopen打开它。如果我有了那个路径,我就不需要重定向stdin了。我可以只创建另一个键盘输入句柄,并独立使用文件和键盘输入。但还是谢谢你的建议。 - Sascha Leyer
2个回答

1
从DOS编程的黑暗时代开始:尝试打开“CON:”(控制台),这是一个保留字。希望在Windows中以相同的方式打开。冒号可能需要,也可能不需要。在命令提示符中,“dir > con:”和“dir > con”仍然有效。
此外,请确保在输出句柄上使用setbuf()系列中的某个内容以避免缓冲...虽然它不应该缓冲终端I/O,但确定一下也无妨。
再次强调,不确定,但我怀疑为输出和输入分别打开单独的FILE *conin, *conout句柄可能有助于解决一个句柄同时处理输入和输出的问题。

1

很难/便携地判断键盘是否存在(您的应用程序可能是从串行端口、Telnet 会话或其他任何地方运行的终端仿真器)。如果实际上存在键盘(包括触摸屏上的键盘图片),那么您无法确定按键需要通过多少层软件才能到达您的应用程序(例如,按键可能从键盘驱动程序经过输入法编辑器、GUI、Shell 到达您的应用程序)。这意味着尝试直接从键盘驱动程序或其他东西获取按键是一个糟糕的想法,在几乎所有情况下都会失败。

解决问题的最佳方法是找出哪些设计失误导致 STDIN 首先被重定向。

例如:也许应用程序应该有一个命令行选项来从文件中读取一些数据;这样应用程序就可以从文件和 STDIN 中获取一些数据(如果命令行选项不存在,则从 STDIN 获取所有数据)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接