我想运行一个程序,并允许用户在同一行输入。我检查文件是否存在,如果不存在,请打印
文件:没有这样的文件或目录
FILE* filename;
filename = fopen(argv[2], "wb");
//validate file name
if(!filename) {
perror(filename);
return EXIT_FAILURE;
}
编译时,我收到以下警告:
期望âconstchar*â,但参数类型为âstructFILE*â
答案 0 :(得分:3)
在上面的代码中,filename
是FILE *
,而不是包含文件名称的字符串。由于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