C程序帮助使用getopt和命令行参数在Unix / Linux中打开文件

黄昏XtremeX

我正在努力完成需要在Unix中使用C编程的大学作业。我必须接受命令行参数,然后打开一个名称作为参数传递的文件。我一直在尝试寻求帮助,但是找不到任何资源来帮助我了解如何将参数解析为字符串并打开所需的文件。我正在寻找使我朝正确方向发展的示例或链接。

我包括一小段代码,试图使用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:我并不是真的希望在这里获得任何直接答案。我希望社区能够以最好的方式帮助我学习。

奇美拉

如评论中所述,您应该使用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);
}

这个例子和更多的信息找到这里

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用命令行参数在C中的文件中查找和替换单词

如何在Swift 3中将getopt与命令行参数一起使用?

使用命令行参数中的getchar和putchar编码程序以发送以进行解码

使用命令行参数打开Python文件

如何使用批处理脚本和命令行参数打开特定的Excel文件?

使用命令行程序打开文件

程序运行但文件不会打开。C++中的命令行

C++ 中的命令行参数

检查C中的命令行参数

C 中的命令行参数

文件操作。一个C程序,它将使用fork()execvp(),wait / waitpid()接受单个命令行参数

如何将两个整数参数传递并使用到 C# 命令行程序中?

无法从C linux中的/ proc位置打开文件夹

在Linux上的C中打开文件时出现问题

使用命令行参数从txt文件中提取并在C ++中运行特定的类

我的Linux C进程如何知道在命令行上打开了多少文件?

如何制作一个 C++ 程序并将使用该目录中的命令行输入和 ls?

在Linux中从命令行打开新的Opera窗口?

使用三个输入文件作为命令行参数运行MPI程序的脚本

使用命令行参数将文件传递给程序

从文件中读取命令行参数

在Windows 10中从命令行打开xz文件

在 C++ Windows 应用程序中访问命令行参数

从命令行参数打开文本文件?

为什么Linux命令行脚本使用'-'和'-'作为参数前缀?

如何找到与选择在桌面环境中打开文件的应用程序相对应的命令行?

在命令行上打开文件时,MFC应用程序在ProcessShellCommand()中崩溃

Linux命令行开关和参数是否有标准?

将多个程序的参数与 main 中的命令行分开