程序未使用命令行上指定的名称创建文件

Program isn't creating file using name specified on the command line

对于这个程序,我应该将我的名字写入终端或用户给出的输出文件(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;
}

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

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

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

除了评论者所说的之外,您还在使用 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]-f 并且 argv[2]my-output-file.txt。 (argv[0] 是您的可执行文件的名称。)因此 fopen(argv[1], ...) 不是您想要的 ;) .