我认为这很简单,但显然不适合我!
我有一个控制台应用程序。我需要从键盘读取输入,但stdin
已被重定向到文件。那么如何创建一个指向键盘流的文件句柄,我可以与fgets
等一起使用呢?
我发现ttyname(0)
似乎是我在POSIX环境中寻找的,而我在这里没有。我在Windows系统中使用标准的Visual Studio编译器。
有什么想法吗?提前谢谢你。
没有简单/可移植的方法来判断键盘是否存在(您的应用程序可能从串行端口、telnet 会话或其他任何东西从终端模拟器运行)。如果键盘确实存在(包括触摸屏上的键盘图片),那么您无法真正判断击键在到达您的应用程序之前需要经过多少层软件(例如,击键可能从键盘驱动程序到输入法编辑器,从GUI到shell到您的应用程序)。这意味着尝试直接从键盘驱动程序或其他东西获取击键是一个坏主意,几乎在所有情况下都会失败。
解决问题的最佳方法是找出哪一系列设计失败导致STDIN首先被重定向。
例如;也许应用程序应该有一个命令行选项来从文件中读取一些数据;这样应用程序就可以从文件中获取一些数据,从STDIN获取一些数据(如果命令行选项不存在,则从STDIN获取所有数据)。
从DOS编程的昏暗黑暗日子中拉出来:尝试打开"CON:"(控制台),一个保留字。希望它将在Windows中以相同的方式打开。 可能需要也可能不需要冒号。 "dir>con:"和"dir>con"在命令提示符下仍然有效。
另外,请务必在输出句柄上使用 setbuf() 系列中的内容以避免缓冲......它不应该缓冲终端I/O,但可以肯定的是,它永远不会受到伤害。
同样,不确定,但我怀疑打开单独的输出FILE *conin, *conout
和一个输入可能会有所帮助,如果您似乎在一个手柄同时执行输入和输出时遇到问题。