2016-10-10 69 views
1

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

我的代码工作时,我想我的名字写入到终端,但是当我想要我的名字写入到用户指定的文件不起作用。代码编译并运行,但文件不存在。

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

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

+0

您是否(a)检查到'argv [1]'包含您尝试打开的写入访问的文件名,(b)在尝试写入文件之前检查'file'是否为非NULL,和(c)假设这两个平移,确保你的程序正在执行的*当前工作目录*建立你试图创建的文件?现在,(a)和(b)似乎是潜在的候选人,后者是违反[Spencer's Sixth Commandment](http://www.seebs.net/c/10com.html) – WhozCraig

+0

的最好例子。通过重新格式化的代码,它出现'fprintf(file,“name”);'只在'argc <2'的情况下 – chux

+0

除了以前的评论,我认为你也忘了在写完fclose(file)之后。 –

回答

4

除了评论者所说的内容之外,您正在使用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], ...)不是你想要的;)。

+0

感谢您的帮助!我得到了它的工作。 – name

相关问题