如何在 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 调用)。 您可以通过打开CONCONIN$ 从控制台读取(绕过重定向)。在您的情况下,一旦您看到 EOF 并开始从控制台读取,您就可以停止从标准输入读取。 【参考方案1】:

您可以将文件名作为命令行参数传递并自己打开,而不是使用输入重定向。

int main (int argc, char **argv)
    FILE *input = stdin;
    if (argc > 2)
        input = fopen(argv[1], "r");
    
    // ...

然后你就可以轻松切换回来了。

    input = stdin;

【讨论】:

感谢您提供此解决方法。它非常有用。不过,我对实际问题的答案非常好奇。

以上是关于如何在 C 程序中重定向标准输入(在 Windows 下)的主要内容,如果未能解决你的问题,请参考以下文章

201671010112 第十二周—— “如何在eclipse中重定向标准输入到文件?”整理方案

如何在 C# 中重定向 IronPython 的标准输出?

Linux中重定向管道和grep命令总结

Linux中重定向管道和grep命令总结

Linux中重定向管道和grep命令总结

在win32中重定向标准输出不会重定向标准输出