将stdin设置为C中的文件时如何从键盘读取

Posted

技术标签:

【中文标题】将stdin设置为C中的文件时如何从键盘读取【英文标题】:How to read from keyboard when stdin is set to a file in C 【发布时间】:2012-09-26 10:28:45 【问题描述】:

我认为这很简单,但显然不适合我!

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

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

有什么想法吗?提前谢谢你。

【问题讨论】:

ttyname 函数在 POSIX 环境中没有帮助,因为当输入来自管道或重定向文件时,它会返回 NULL stdin has been redirected to a file. - 你为什么不fclose 那个文件指针和freopen 标准输入到一个新文件。完成后,再次将标准输入重定向到旧文件。 在某种程度上,这就是我想做的 nav_jan,但如果我不知道控制台的路径,我无法使用 fopenfreopen 打开它。如果我有那个路径,我不需要重定向stdin。我可以为键盘输入创建另一个句柄,并独立使用文件输入和键盘输入。不过谢谢你的想法。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

在这里摆脱 DOS 编程的黑暗日子:尝试打开“CON:”(控制台),这是一个保留字。希望它会在 Windows 中以相同的方式打开。冒号可能需要也可能不需要。 "dir >con:" 和 "dir >con" 在命令提示符下仍然有效。

此外,请务必在输出句柄上使用 setbuf() 系列中的某些内容以避免缓冲...它不应该缓冲终端 I/O,但确定它永远不会有坏处。

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

【讨论】:

以上是关于将stdin设置为C中的文件时如何从键盘读取的主要内容,如果未能解决你的问题,请参考以下文章

如何使用C从键盘读取字符串?

scanf()函数分析

用freopen打开文件之后,如何相应关闭文件使得可以再次从键盘输入?

C语言如何从键盘读取N个数

从串行端口(C/C++)读取时,如何实现 read() 超时

文件描述符