我想运行一个程序,并允许用户在同一行上输入。我检查文件是否存在,如果不存在,请打印
文件: 没有这样的文件或目录
FILE* filename;
filename = fopen(argv[2], "wb");
//validate file name
if(!filename) {
perror(filename);
return EXIT_FAILURE;
}
编译时,我收到以下警告:
预期的"const char *",但参数的类型是"结构文件 *"
在上面的代码中,filename
是一个FILE *
,而不是带有文件名的字符串。 由于argv[2]
似乎是文件名,您可以尝试:
if(!filename) {
perror(argv[2]);
return EXIT_FAILURE;
}
。但是您应该首先检查是否已设置argv[2]
(该argc > 2
)。
代码需要打印文件名,而不是具有NULL
值的FILE *
。
在没有额外检查的情况下打印无法打开的文件的名称是不明智的。 用引号或其他东西打印名称也很好,以帮助划分麻烦文件名的开头和结尾。
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;
}
FILE* filename;
filename = fopen(argv[2], "wb");
//validate file name
if(!filename) {
fprintf(STDERR,"%s", filename);
perror(" files to open: ");
}
perror 打印错误消息,后跟最后一个错误的字符串表示形式;
行:
perror(filename);
引用指向文件描述符的指针不是指向字符字符串的指针。
建议使用:
perror(argv[2]);
顺便说一句:perror() 输出到 stderr,而不是 stdout