从stdin或多个文件参数读取

时间:2013-03-20 02:48:41

标签: c linux

我的主要应该做的是使用系统调用从stdin读取。或者,如果给出文件参数,则打开文件参数。我已经将其编码为从一个文件参数中读取。但是现在我需要它从多个文件参数中打开,而我对如何执行此操作的逻辑很缺乏。如何让我的代码能够打开多个文件参数?

int main(int argc, char *argv[]) {
    char *file_pathname = NULL;
    int fd;
    char file_buffer[540];

    //Check for proper number of arguments:
    if(argc < 2) {
        exit(2);
    }

    if(argc < 3) {
        file_pathname = "stdin";
    }

    file_pathname = argv[2];   

    if(argc < 3) {
        ((fd = read(STDIN_FILENO,file_buffer, FILE_BUFFER_SIZE)));
    }
    // FILE argument given, so try to open it:
    if (argc == 3) {
        if ((fd = open(file_pathname,O_RDONLY)) == -1) {
            perror("ERROR OPENING FILE");
            return 2;
        }

2 个答案:

答案 0 :(得分:1)

如果您希望程序仅在Linux(POSIX兼容)系统上运行,您可能会感兴趣

man 3 getopt

这个函数可以帮助您以简短的unix样式解析命令行参数,例如:

myprog -a 5654 -f -n ~/Test/input.txt

如果要解析长选项,还有getopt_long()和getopt_long_only()。

如果你想要一些特定的参数解析器(我不推荐),你可以将它实现为库。

如果你使用glib或gtk,有glib解析器。如果你有一个qt项目,或者qxt中的解析器(扩展Qt库)。或者,如果需要,您可以直接谷歌获取更轻量级的跨平台参数解析器。

答案 1 :(得分:0)

从获取文件descritor并执行所需操作的函数开始:

void do_stuff(int fd);

添加另一个,使用文件名:

void do_stuff_fname(const char *fname);  /* Open fname and call do_stuff */

现在,您的main应该致电:

if (argc < 2) {
    do_stuff(STDIN_FILENO);
} else {
    int i;
    for (i=1; i<argc; i++) do_stuff_fname(argv[i]);
}

您可以使用getopt作为JustAnotherCurious suggested

来改善这一点