如何在14个程序中重定向stdin(在Windows下)

时间:2014-12-25 03:06:06

标签: c windows console-application

我有一个名为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后< in.txt(这是Windows)我得到:

>>Hello!
>>Goodbye!
>>Command blablabla not recognized
>>no command found
>>no command found
>>no command found
... (infinite loop)

我猜fgets一直在这里得到EOF,我的解析器对EOF的反应是打印没有找到命令的消息。 我想做的是能够在输入文件与"<"一起使用后将输入流返回到stdin。重定向结束,所以我可以再次使用键盘。类似的东西:

if (in_string[0] == EOF)
    stop_using_a_file_as_stdin_and_go_back_to_normal();

有没有办法做到这一点?

编辑: Harry Johnston在评论中给出的答案:

freopen("CON", "r", stdin);

或:

freopen("CONIN$", "r", stdin);

1 个答案:

答案 0 :(得分:2)

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

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

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

    input = stdin;