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

Я пытаюсь работать над своим заданием в колледже, которое требует программирования на 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, но аргумент является строкой.

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

Если вы собираетесь использовать getopt, вам не следует использовать argv непосредственно в блоке switch. Вместо этого вы должны использовать optarg.

Mike Holt 31.01.2019 00:22

Вы также должны явно показать команду, которую вы вводите.

Mike Holt 31.01.2019 00:25

@MikeHolt Что ты имеешь в виду? Извини, я не понял.

DuskXtremeX 31.01.2019 01:28

@PManojMJ Если вы найдете какой-либо ответ полезным (ответили на ваш вопрос), здесь, в StackOverflow, принято принимать ответ или голосовать за него.

Chimera 31.01.2019 05:38

@Химера, извини. Я был занят своей работой. Я сделал это сейчас. Спасибо, что напомнили. Так держать. Ваше здоровье!!

DuskXtremeX 31.01.2019 05:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
1 224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упоминалось в комментариях, вы должны использовать 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);
}

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

Спасибо за ресурс. Я пройду через это и опубликую обновление.

DuskXtremeX 31.01.2019 01:38

Другие вопросы по теме