使用 main()<可以轻松使用文件重定向和管道,以及交互式用户输入阅读/ em> ,如此C代码段所示......
main()
...我不确定是否有一种现代的UNIX源码兼容且易于以编程方式实现 C 中#define SIZ 1024
#include <stdio.h>
#include <stdlib.h>
extern void do_something_with_the_array(float *, int);
int main(int argc, const char * argv[])
{
float f[SIZ];
int k = 0;
if(argc > 2){
for(k = 0; k < argc - 1; k++)
f[k] = (float)atof(argv[k+1]);
}
else while ((scanf("%f", &f[k]) == 1)&&(k < SIZ))
k++;
do_something_with_the_array(f, k);
return 0;
}
的三种可能性中的任何一种,具体取决于上下文?
我理解管道和重定向“属于”shell,它在程序开始执行之前拦截程序,而命令行参数和交互式阅读“属于” main() < / strong>本身,因此可能没有一种简单的方法可以做到这一点。
我看到使用 stdin 或文件输入或管道输入非常明显。但是,阅读命令行参数是一个不同的故事。这是一个演示我通常如何编码的演示,但它看起来有点笨拙并且被黑客入侵。此外,在更复杂的选项场景中,这可能会成为一个相当混乱的代码。我也不确定这是多么安全或傻瓜证明......
{{1}}
提前致谢!
答案 0 :(得分:1)
我不知道C库的副作用会使你提到的三个具体案例看起来一样(虽然有人这样做,请回答,因为我也想知道!)。我认为您正在寻找与the diamond <>
operator in Perl不同的东西,但是对于单个参数而不是包含参数的文件。
我认为@David Hoelzer有正确的想法:分别处理这三个案例。例如,在处理命令行或文件参数时,不要生成&#34;输入值&#34;提示您可以打印以进行交互式输入。对于命令行处理,getopt是一个很好的起点。
现在,对您来说是一个挑战:将这三个操作包装在库中并使其成为开源的,这样我们其他人就可以受益! :)
答案 1 :(得分:1)
如果用键盘输入和文件输入调用它们,包括shell本身,很多程序都会关注它们。
让我们以/ bin / sh作为我们的第一个例子。如果你直接调用它,它会启动一个交互式shell,但如果你把一些东西输入它,它就会以非交互式阅读shell的形式出现。两者之间的主要区别在于,如果它不是交互式的,则不会显示$提示符。但是,如果它确实是交互式的,可以使用-i选项启动它,使其在通常决定的情况下假设它是交互式的。
这里涉及的魔力是isatty()
;见man 3 isatty
。
此外,有些程序喜欢在处理重定向标准输入时接收键盘输入。这有两种普遍受欢迎的方式;打开和读取/dev/tty
或读取标准错误,具体取决于上下文。交互式启动管道中的大多数内容没有重定向的标准错误,因此这往往效果很好(读取重定向的标准错误会立即产生错误,因为句柄未打开以进行读取)。如果您想使其完全可自动化,请阅读标准错误,否则请阅读/dev/tty
。