我有一个名为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);
答案 0 :(得分:2)
您可以将文件名作为命令行参数传递并自行打开,而不是使用输入重定向。
int main (int argc, char **argv){
FILE *input = stdin;
if (argc > 2){
input = fopen(argv[1], "r");
}
// ...
然后你可以轻松切换回来。
input = stdin;