将文件名打印到stdout

时间:2015-06-15 20:05:22

标签: c file error-handling

我想运行一个程序,并允许用户在同一行输入。我检查文件是否存在,如果不存在,请打印

  

文件:没有这样的文件或目录

    FILE* filename;
    filename = fopen(argv[2], "wb");
        //validate file name
        if(!filename) {
            perror(filename);
            return EXIT_FAILURE;
        }

编译时,我收到以下警告:

  

期望âconstchar*â,但参数类型为âstructFILE*â

4 个答案:

答案 0 :(得分:3)

在上面的代码中,filenameFILE *,而不是包含文件名称的字符串。由于argv[2]似乎是文件名,因此您可以尝试:

        if(!filename) {
            perror(argv[2]);
            return EXIT_FAILURE;
        }

...但您应首先检查argv[2]是否已设置(argc > 2)。

答案 1 :(得分:2)

   FILE* filename;
    filename = fopen(argv[2], "wb");
        //validate file name
        if(!filename) {
            fprintf(STDERR,"%s", filename);
            perror(" files to open: ");
        }

perror打印错误消息,后跟最后一个错误的字符串表示;

答案 2 :(得分:1)

代码需要打印文件的名称,而不是FILE *NULL

在没有额外检查的情况下打印无法打开的文件名称是不明智的。也可以用引号或其他东西打印名称,以帮助划分麻烦的文件名的开头和结尾。

OP的原始“文件名”是文件变量名称的弱选择,因为变量不是文件的名称。建议像“output_file”这样的东西。 argv[2]是文件的名称。

const char *filename = argv[2];
FILE* output_file;

output_file = fopen(filename, "wb");
//validate file pointer
if(!output_file) {
   perror("Unable to open file for writing.");
   if (argc > 2 && filename) {
     fprintf(stderr, "\"%s\"\n", filename);
   }
   return EXIT_FAILURE;
}

答案 3 :(得分:0)

在这一行:

perror(filename);

指的是指向文件描述符的指针 不是指向字符串的指针。

建议使用:

perror(argv[2]);

BTW:perror()输出到stderr,而不是stdout