将多个文件重定向到stdin

Var*_*Rao -1 bash

我正在运行一个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程序?

ilk*_*chu 5

通常,您只使用重定向标准输入(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)