【问题标题】:C How to take multiple files for arguments?C 如何获取多个文件作为参数?
【发布时间】:2020-02-17 11:17:57
【问题描述】:

您会如何要求用户输入文件作为要使用的参数(尽可能多)?另外,您将如何打印到文件?

scanf("%s", user_filename);

    FILE *fp;
    fp = fopen (user_filename, "r");

我尝试过对其进行各种处理,但我只能获取一个文件。

【问题讨论】:

  • 您能否更具体地回答您的问题,如果可能,请向我们展示 som 代码
  • 我假设用户会输入一个字符串 (char*),然后您会将字符串解析为零个或多个文件路径 (char*)。然后为文件路径创建文件指针(FILE)并通过文件指针对文件进行操作。
  • 您的意思是一次一个,还是在同一行输入的以空格分隔的文件名列表?
  • @WhozCraig 是的,都在一行上,只是用空格隔开,所以 a.txt b.txt...
  • 如果您将文件名作为命令行参数传递,mycommand file_name1 file_name2 等,而您的主要文件名是 int main( int argc, char *argv[] ),那么从索引 1 开始的数组 argv[] 将收集所有文件名你。所以argv[1] 将是“filename1”,argv[2] 将是“filename2”,等等。

标签: c file arguments text-files


【解决方案1】:

将某些文件名传递给 C 程序的最简单方法是将它们作为参数传递给 C 程序。

使用main的参数将参数传递给C程序:

int main( int argc, char *argv[] )
{
    ...
}

argc 表示有多少个参数,argv[] 是一个包含参数的字符串指针数组。请注意,索引0 处的第一个参数(argv[0] 指向的字符串)是命令名称本身。传递给命令的其余参数在argv[1]argv[2] 等中。

如果你编译你的程序并这样调用它:

my_prog foo.txt bar.txt bah.txt

那么argc 的值将是4(记住它包括命令),argv 的值将是:

argv[0] points to "my_prog"
argv[1] points to "foo.txt"
argv[2] points to "bar.txt"
argv[3] points to "bah.txt"

那么在你的程序中,你只需要检查argc 有多少参数。如果argc > 1,那么你至少有一个参数以argv[1]开头:

int main( int argc, char *argv[] )
{
    int i;
    FILE *fp;

    // If there are no command line parameters, complain and exit
    //
    if ( argc < 2 )
    {
        fprintf( stderr, "Usage: %s some_file_names\n", argv[0] );
        return 1;  // This exits the program, but you might choose to continue processing
                   // the other files.
    }

    for ( i = 1; i < argc; i++ )
    {
        if ( (fp = fopen(argv[i], "r")) == NULL )
        {
            fprintf( stderr, "%s: Gah! I could not open file named %s!\n", argv[0], argv[i] );
            return 2;
        }

        // Do some stuff with file named argv[i], file pointer fp

        ...
        fclose( fp );
    }

    return 0;
}

这只是几种不同的方法之一(功能上和风格上),具体取决于您需要如何处理文件。

【讨论】:

  • 感谢您澄清了我最困惑的参数。
  • 如何将 argv 与 File_%03d.png 一起使用?
  • @MarcusJ 你能更具体一点吗?您是在谈论将字符串`℅03d.png`作为参数传递给命令吗?还是您真的希望您的程序在指定文件夹中找到与特定模式匹配的所有文件?
  • 我希望能够使用以下命令运行我的程序:ProgramName /Path/Image_%03d.png OutputFile。我见过很多程序支持这种语法,所以我相信有一个像 getopt 这样的函数可以处理这样的事情,但我找不到它。也许我的谷歌搜索很糟糕。
  • @MarcusJ 你可以这样做。在这种情况下,argv[1] 将指向字符串 "/Path/Image_%03d.png"。您需要编写一些代码,将%03d 转换为FindFirstFile 可以理解的通配符格式。但更好的方法是让 shell 整理文件的枚举并使用 shell 可识别的通配符参数,例如ProgramName /Path/Image_[0-9][0-9][0-9].png OutputFile,然后你的程序将看到每个@987654344 @ 文件分别在argv 数组中。
猜你喜欢
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多