C программа помогает открыть файл в Unix / Linux, используя getopt и аргумент командной строки - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь работать над своим заданием в колледже, которое требовало программирования на C в Unix.Я должен взять аргументы командной строки и открыть файл с именем, переданным в качестве аргумента.Я пытался найти помощь, но не смог найти никаких ресурсов, которые бы помогли мне понять, как разобрать аргумент в виде строки и открыть нужный файл.Я ищу примеры или ссылки, которые указывают мне правильное направление.

Я включаю короткий фрагмент кода, где я пытаюсь проанализировать параметры с помощью getopt ().Что я делаю не так?

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>


int main(int argc[], char *argv[])
{
        int option;
        while(option = getopt(argc, argv, "hi:o:") != -1)
        {
                switch (option){
                        case 'h':
                                printf("Usage : -i [input file name]\n-o [output file name]");
                                break;
                        case 'i':
                                printf("\n Input file is: %s",argv[1]);
                                break;
                        case 'o':
                                printf("\n Output file is: %s",argv[2]);
                                break;
                }
        }

return 0;
}

Я продолжаю получать сообщение «Ошибка нераспознанной командной строки».Кроме того, когда я пытаюсь включить текстовый файл, я считаю, что ошибка говорит о том, что опция анализируется как int, но аргумент является строкой.

PS: Я не очень-то рассчитываю получить прямые ответы здесь.Я хочу, чтобы сообщество помогло мне учиться наилучшим образом.

1 Ответ

0 голосов
/ 31 января 2019

Как уже упоминалось в комментариях, вы должны использовать optarg.Вот пример, который является довольно полным:

/*
    example of command line parsing via getopt
    usage: getopt [-dmp] -f fname [-s sname] name [name ...]

    Paul Krzyzanowski
*/

#include <stdio.h>
#include <stdlib.h>

int debug = 0;

int
main(int argc, char **argv)
{
    extern char *optarg;
    extern int optind;
    int c, err = 0; 
    int mflag=0, pflag=0, fflag=0;
    char *sname = "default_sname", *fname;
    static char usage[] = "usage: %s [-dmp] -f fname [-s sname] name [name ...]\n";

    while ((c = getopt(argc, argv, "df:mps:")) != -1)
        switch (c) {
        case 'd':
            debug = 1;
            break;
        case 'm':
            mflag = 1;
            break;
        case 'p':
            pflag = 1;
            break;
        case 'f':
            fflag = 1;
            fname = optarg;
            break;
        case 's':
            sname = optarg;
            break;
        case '?':
            err = 1;
            break;
        }
    if (fflag == 0) {   /* -f was mandatory */
        fprintf(stderr, "%s: missing -f option\n", argv[0]);
        fprintf(stderr, usage, argv[0]);
        exit(1);
    } else if ((optind+1) > argc) { 
        /* need at least one argument (change +1 to +2 for two, etc. as needeed) */

        printf("optind = %d, argc=%d\n", optind, argc);
        fprintf(stderr, "%s: missing name\n", argv[0]);
        fprintf(stderr, usage, argv[0]);
        exit(1);
    } else if (err) {
        fprintf(stderr, usage, argv[0]);
        exit(1);
    }
    /* see what we have */
    printf("debug = %d\n", debug);
    printf("pflag = %d\n", pflag);
    printf("mflag = %d\n", mflag);
    printf("fname = \"%s\"\n", fname);
    printf("sname = \"%s\"\n", sname);

    if (optind < argc)  /* these are the arguments after the command-line options */
        for (; optind < argc; optind++)
            printf("argument: \"%s\"\n", argv[optind]);
    else {
        printf("no arguments left to process\n");
    }
    exit(0);
}

Этот пример и дополнительная информация найдены здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...