【问题标题】:Program isn't creating file using name specified on the command line程序未使用命令行上指定的名称创建文件
【发布时间】:2017-02-19 07:45:30
【问题描述】:

对于这个程序,我应该将我的名字写入终端或用户提供的输出文件(case 'f')。

#include <stdio.h>

int main(int argc, char **argv)
{
    // no output file print to screen, print name to terminal
    if (argc < 2)
    {
        fprintf(stdout, "name\n");
    }
    //print name to output file given by user
    else
    {
        int option;
        int fFlag = 0;
        while ((option = getopt(argc, argv, "f:")) != -1)
        {
            //if case 'f' print to output file
            switch (option)
            {
                case 'f':
                    fFlag = 1;  // flag indicates writing name to file
                    break;
                    //case f or error
                case '?':
                    printf("error");
                    break;
            }
        }
        //write to name to output file
        if (fFlag)
        {
            FILE *file = fopen(argv[1], "w");
            fprintf(file, "name");
        }
    }
    return 0;
}

当我想将我的名字写入终端时,我的代码有效,但当我想将我的名字写入用户提供的文件时,它不起作用。代码编译并运行,但文件不存在。

命令行中的文件可能不存在。我应该在程序中创建文件吗?

我明白我做错了什么。谢谢大家!

【问题讨论】:

  • 您是否 (a) 检查 argv[1] 是否包含您尝试打开以进行写访问的文件名,(b) 在尝试写入之前检查 file 是否为非 NULL它,并且 (c) 假设这两个都成功了,请确保您的程序正在执行的 当前工作目录 建立了您尝试创建的文件?现在,(a)和(b)似乎是潜在的候选人,后者是违反Spencer's Sixth Commandment的典型例子
  • 使用重新格式化的代码,fprintf(file, "name"); 似乎只在argc &lt; 2 的情况下
  • 除了之前的评论,我想你写完后也忘记做fclose(file)了。
  • 顺便说一句,getopt requires &lt;unistd.h&gt;,您似乎也省略了。这很重要。

标签: c command-line-arguments fopen getopt


【解决方案1】:

除了评论者所说的之外,您正在使用getopt 进行部分解析,因此应该将其用于其余部分!

int main...
char *filename;    /**1**/
...
  case 'f': 
    fFlag = 1;
    filename = optarg;  /**2**/
....
  FILE *file = fopen(filename , "w");  /**3**/

解释:f:getopt 表示getopt 将尝试查找与f 一起出现的选项。在getopt 循环中,例如'f',该选项被放入变量optarg。至少对于 GNU getopt,它是指向 argv 的指针,因此您不必复制它。您可以将其指针值(在上面的*2*)存储到您为此目的创建的变量中(*1*)。然后,您可以打开该特定文件,而无需考虑它在 argv (*3*) 中的位置。参见GNU getopt example中选项c的处理。

编辑您没有显示您正在使用的命令行,但我猜它类似于

./foo -f my-output-file.txt

——在这种情况下,argv[1]-fargv[2]my-output-file.txt。 (argv[0] 是您的可执行文件的名称。)因此,fopen(argv[1], ...) 不是您想要的;)。

【讨论】:

    猜你喜欢
    • 2013-12-07
    • 2020-04-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    相关资源
    最近更新 更多