如何在 C 程序中重定向标准输入(在 Windows 下)
Posted
技术标签:
【中文标题】如何在 C 程序中重定向标准输入(在 Windows 下)【英文标题】:How to redirect stdin back within C program (under Windows) 【发布时间】:2014-12-25 03:06:05 【问题描述】:我有一个名为 a.exe 的简单 C 程序,主循环如下:
void input_console()
printf(">>");
char in_string[256] = 0;
fgets(in_string, 256, stdin);
parse(in_string);
当我启动它并从键盘输入命令时,它的工作原理如下:
>>say_hello
Hello!
>>say_goodbye
Goodbye!
>>
no command found
>>blablablabla
Command blablablabla not recognized
>>
no command found
等等
现在我想从文件而不是键盘读取输入,所以我准备 in.txt 如下:
say_hello
say_goodbye
blablabla
运行 a.exe
>>Hello!
>>Goodbye!
>>Command blablabla not recognized
>>no command found
>>no command found
>>no command found
... (infinite loop)
我猜 fgets 一直在这里得到 EOF,而我的解析器对 EOF 的反应是打印 no command found 消息。 一旦我使用“
if (in_string[0] == EOF)
stop_using_a_file_as_stdin_and_go_back_to_normal();
有什么办法吗?
编辑: Harry Johnston 在 cmets 作品中给出的答案:
freopen("CON", "r", stdin);
或:
freopen("CONIN$", "r", stdin);
【问题讨论】:
如何检查函数的返回值,也许其中一个表示错误?此外,还有一些函数可让您检查流是否处于 EOF。也就是说,切换“回”是不可能的,因为没有什么可以切换回的。 嗯,是的,从技术上讲,它不是切换“返回”,但问题是:如何将 fgets 读取的内容重定向到标准输入而不是文件。 没有所谓的“标准输入”,它只是“程序的标准输入”。在您的情况下,这是一个文件,没有什么可以改变它。不过,让我问你一个问题:你为什么需要它?通常,命令行程序会在输入结束时终止。 我主要是出于好奇想了解 Windows 如何处理这些事情。似乎操作系统中的某处改变了程序从何处获取输入。似乎也应该可以从程序内部更改它(可能通过一些 WinAPI 调用)。 您可以通过打开CON
或CONIN$
从控制台读取(绕过重定向)。在您的情况下,一旦您看到 EOF 并开始从控制台读取,您就可以停止从标准输入读取。
【参考方案1】:
您可以将文件名作为命令行参数传递并自己打开,而不是使用输入重定向。
int main (int argc, char **argv)
FILE *input = stdin;
if (argc > 2)
input = fopen(argv[1], "r");
// ...
然后你就可以轻松切换回来了。
input = stdin;
【讨论】:
感谢您提供此解决方法。它非常有用。不过,我对实际问题的答案非常好奇。以上是关于如何在 C 程序中重定向标准输入(在 Windows 下)的主要内容,如果未能解决你的问题,请参考以下文章