我正在尝试读取已从文件重定向的命令行参数。我正在使用的命令是./a.out int main(int argc, char* argv[], char* envp[]) {
for (int i = 1; i < argc; i++) {
printf("%s\n", argv[i]);
}
}
答案 0 :(得分:3)
shell在为程序准备命令行之前会拦截重定向命令:
myProg <infile -t >outfile
将传递给程序
myProg -t
其中stdin
和stdout
已在路由图开始之前重新路由。因此,该程序再也看不到重新分配。
答案 1 :(得分:0)
除了简单的废止之外,还有很多情况:
dir > myfile.txt
特别是,您可以将输出从一个程序传递到另一个程序:
dir | more
如果将dir
命令发送到more
命令,它将发送输出。由于程序启动是由OS Shell处理的,因此它也可以处理重定向。
答案 2 :(得分:-1)
因为语言是用这种方式定义的。假设您说的是真的-
全部用户输入必须来自命令行参数,但是从文件重定向的文本可以满足不同功能所需的输入。如果输入显示为命令行参数,则可以实现 。
考虑此程序:
#include <stdio.h>
int is_dict(char *word)
{
/* code to look up a dictionary */
int result = 1;
return result;
}
int main(int argc, char *argv[])
{
if(argc == 2 && is_dict(argv[1]))
printf("%s found", argv[1]);
return 0;
}
如果以这种方式编写程序来容纳它,那么输入将必须来自命令行参数。 未重定向后,您将如何接受输入?要检测丢失的输入,将需要更多的程序开销。
此外,想象一个包含一百万个单词的文本文件:期望每个单词以argv[n]
的形式到达是不可行的。
还有其他反对意见。假设程序打印了一系列提示进行响应。用户必须事先知道提示是什么,才能在提示出现之前提供答案。
最后,如果程序是从GUI运行的,那么在运行之前,所有程序的输入都必须编辑成其属性。