这个问题可能有点难以说明。例如,程序从stdin
接收一个字符串,但它需要来自用户的交互式输入,如下所示:
echo "Some text to handle later after command is specified" | a.out
在项目开始时:
printf("Please input command first");
scanf("%s", &cmd);
/* Some Code Here */
/* process "Some text to handle later after command is specified" */
有没有办法暂停"暂停"先前的输入流并等待scanf
的输入流?
答案 0 :(得分:1)
使用管道时,shell会将程序stdin
设置为来自上一个命令的输出。所以阅读应该不是问题。
这里的问题是,如果输入来自管道(或重定向),则不应打印任何输出。这可以通过检查isatty
函数的结果来完成:
if (isatty(fileno(stdin)))
{
/* Only print prompt if input is an interactive terminal */
printf(...);
}
scanf(...);
或者我误读了你,因为你想从用户那里读取两个,和来自管道?然后你可能需要打开与终端的直接连接。
为此,您可以使用ttyname
获取stdout
的TTY设备的名称,并打开该设备以输入以读取用户输入。如果stdout
导致管道(或被重定向),那将无法工作。
答案 1 :(得分:1)
除了从stdin读取之外,标准没有指定任何获取交互式用户输入的方法。由于你的stdin被一个管道占用,你需要踏上一个特定于实现的路径。
对于类Unix系统,它是一个名为/dev/tty
的特殊文件。 fopen
它并使用普通的stdio函数。
在Windows上,您可能需要调用Console API。
Threre不保证程序附加到任何交互设备,因此准备失败。
请注意,以这种方式编写程序被认为是不好的风格。如果预期有任何用户输入,那么一个运行良好的程序应该只使用stdin。然后,所有其他输入流应通过命令行参数作为文件名传递。