我正在运行一个C程序(在Ubuntu - bash终端上),它需要3个文件的输入 - f1, f2, f3.
for(...)
scanf(....)//reads input from f1
for(...)
scanf(....)//reads input from f2
for(...)
scanf(....)//reads input from f3
Run Code Online (Sandbox Code Playgroud)
我想在bash上使用重定向操作符为C程序提供输入.
但是,如果我按如下方式运行我的程序,我只能从1个文件中读取:
./a.out < f1
Run Code Online (Sandbox Code Playgroud)
如何重定向的输入f1, f2,和f3我的C程序?
通常,您只使用重定向标准输入(fd 0,使用<重定向运算符),标准输出(fd 1,>)和标准错误(fd 2,2>),这似乎只限制您只有一个输入流.
(当然你可以做类似的事情cat f1 f2 f3 | program,但告诉文件分开会很难.)
但是,如果你真的想要,你也可以使用其他文件描述符号作为输入.这与重定向时的方式相同stderr,只需在重定向运算符之前添加数字即可.所以,跑步
./prog 3<file1 4<file2 5< file3
Run Code Online (Sandbox Code Playgroud)
将在fd的3,4和5中打开给定的文件并将其传递给./prog.然后,程序可以使用fdopenstdio streams(FILE *)与它们相关联.这里最大的问题是你需要一些方法来了解在程序中使用哪个fd,这很快就会需要使用命令行参数之类的东西.下面的玩具示例是固定的,以使用这三个fd,这当然不会扩展至少.
相反,你最好做其他所有程序所做的事情,并将文件名作为命令行参数传递.即使在你需要引用已经打开的文件描述符的情况下,许多Unix也有一种通过名称引用它们的方法:/dev/fd/1等等(进程替换,类似于通用管道,是需要的东西之一)去做这个.)
愚蠢的fdopen()例子:
#include <stdio.h>
void read_a_line(int fd)
{
char buf[64];
FILE *f = fdopen(fd, "r");
fgets(buf, 64, f);
printf("fd %d: %s\n", fd, buf);
fclose(f);
}
int main(void)
{
read_a_line(3);
read_a_line(4);
read_a_line(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1195 次 |
| 最近记录: |