0

我的主要工作是使用系统调用从标准输入读取。或者,如果给出了文件参数,则打开文件参数。我已经对此进行了编码以从一个文件参数中读取。但是现在我需要它从多个文件参数中打开,而且我对如何执行此操作的逻辑缺乏了解。如何让我的代码能够打开多个文件参数?

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;
        }
4

2 回答 2

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 库)。或者,如果需要,您可以只搜索更轻量级的跨平台参数解析器。

于 2013-03-20T03:11:31.547 回答
0

从获取文件描述符并执行您想要的操作的函数开始:

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 所建议的那样,您可以通过使用来改进这一点

于 2013-09-26T21:48:16.887 回答