打开不存在文件失败的返回值c .



我目前正在研究一个程序,如果输入文件无法打开或不存在,它应该返回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

相关内容

  • 没有找到相关文章

最新更新