c - 如何删除未检查的返回值警告?
问题描述
我有一个代码,其中我收到未检查返回值的警告-
bool check() {
FILE* fptr = fopen(fi.txt, "r");
if(fptr != NULL) {
while(!feof(fptr)) {
fscanf(fptr, "%s", var1);
if(strcmp(fptr, var2) == 0) {
fclose(fptr);
return true;
}
}
fclose(fptr);
}
return false;
}
当我收到这样的警告时,我找到了一种重写此代码的方法
Calling fscanf(fptr, "%s", var1) without checking return value. This library function may fail and return an error code.
这是另一种方式,这种方式是否正确-
if(fptr != NULL) {
while(fscanf(fptr, "%s", var1) == 0) {
if(strcmp(var1, var2) == 0) {
fclose(fptr);
return true;
}
fclose(fptr);
}
return false;
}
解决方案
不要使用while(feof)
. 相反,只需检查读取实际数据是否成功。
不:
while(!feof(fptr)) {
fscanf(fptr, "%s", var1);
做就是了:
while(fscanf(fptr, "%s", var1) == 1) {
我不喜欢嵌套if
的错误处理。我很可能更喜欢带有单个返回点的简短错误处理语句,因为我受到内核样式的影响:
bool check() {
FILE* fptr = fopen(fi.txt, "r");
if (fptr == NULL) goto fopen_failed; // short error handling with goto-s
bool ret = false;
while(fscanf(fptr, "%s", var1) == 1) {
if(strcmp(fptr, var2) == 0) {
ret = true;
break;
}
}
fclose(fptr);
fopen_failed:
return ret; // single return point
}
推荐阅读
- firebase - 我可以使用此快照调用访问文档 ID 吗?
- javascript - jQuery 背景随 id 变化
- swift - 什么是suppressesIncrementalRendering?
- android - 与许多设备的蓝牙连接
- intellij-idea - Intellij 本地历史“贴标签”有什么意义?
- django - Nginx 502 网关错误 - gcp
- typescript - 如何查看来自 TypeScript 插件的日志?
- sql - SQL连接两个表并从两个表中删除重复项,但不会丢失表本身的任何重复项
- javascript - 部署到 Heroku 时如何使 api 端点以用户的本地主机为目标
- android - 如何添加重新发送otp firebase android的代码