我目前正在研究一个程序,如果输入文件无法打开或不存在,它应该返回2,但我得到的是分割错误。现有的输入文件已经存在于我的文件夹中,它应该在其名称作为参数写入时被打开,如下面的代码所示:
int max_plateau = 0;
for (int i = 1; i < argc - 1 ; i++) {
FILE *input = fopen(argv[i], "r");
if (ferror(input)) {
return 2;
} else {
read_file(input, &bridges, &count, max_plateau);
if (max_plateau != 0) {
bridges[max_plateau - 1] += 1;
bridges[max_plateau] += 1;
}
max_plateau = count;
fclose(input);
}
}
输出文件
也是如此if (argv[argc - 1] == NULL)
return 2;
else {
int odd = 0;
find_result(&ungerade, anzahl, &bruecken);
FILE *output = fopen(argv[argc - 1], "w");
if (ferror(output)) {
if (bridges != NULL) {
free(bridges);
}
return 2;
} else {
print(output, odd, &bridges, count);
fclose(output);
}
}
检查fopen
的返回值:
FILE *input;
if( (input = fopen(argv[i], "r")) == NULL ){
perror(argv[i]);
return 2;
}
ferror
仅用于检查文件句柄上的错误指示器,该指示器可以在对该句柄的某些操作失败时设置。未能打开文件不是对文件句柄的操作。该文件句柄不存在,直到fopen
创建成功。如果路径不存在(或任何其他条件阻止fopen
成功),fopen
将返回NULL
。将NULL
作为参数传递给ferror
是无效的。
fopen()
如果无法打开文件,则返回空指针。
使用空指针调用ferror()
会导致未定义的行为,如您所见。
ferror()
不能用于此目的,该函数访问FILE
结构体中的错误指示器,该指示器可能由对失败流的操作设置。例如,如果流位于文件末尾或流上有某种错误,getc()
返回EOF
。调用ferror(file)
或feof(file)
可以帮助确定发生了什么,但这些函数几乎从不使用。在其他情况下调用feof()
,例如在文件操作之前测试是否到达文件结束是一个常见的错误.
修改后的版本:
int max_plateau = 0;
for (int i = 1; i < argc - 1 ; i++) {
FILE *input = fopen(argv[i], "r");
if (input == NULL) {
return 2;
} else {
read_file(input, &bridges, &count, max_plateau);
if (max_plateau != 0) {
bridges[max_plateau - 1] += 1;
bridges[max_plateau] += 1;
}
max_plateau = count;
fclose(input);
}
}
[...]
// The same fix for the output file
if (argv[argc - 1] == NULL) {
return 2;
} else {
int odd = 0;
find_result(&ungerade, anzahl, &bruecken);
FILE *output = fopen(argv[argc - 1], "w");
if (output == NULL) {
free(bridges); // OK to call free with a null pointer
return 2;
} else {
print(output, odd, &bridges, count);
fclose(output);
// should we free bridges?
}
}
fopen()
在失败时返回NULL
,因此在将返回值传递给ferror()
之前必须检查是否存在。
换句话说,你应该使用
if(input == NULL || ferror(input))
不是
if(ferror(input))
(为output
添加这样的检查)
这很简单,在处理fopen
错误情况时,请将ferror(input)
替换为!file
。