【发布时间】:2023-04-01 12:56:01
【问题描述】:
我有一个名为 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 并开始从控制台读取,您就可以停止从标准输入读取。
标签: c windows console-application