c - 如何在C中正确关闭文件
问题描述
我通常要么从文件名中读取,stdin
要么从文件名中读取:
FILE *open_file(char *filename, FILE *fallback, char *mode)
{
FILE *fp = fallback;
if (filename != NULL) {
if ((fp = fopen(filename, mode)) == NULL) {
fprintf(stderr, "Error: cannot open '%s'!\n", filename);
exit(ERROR_CANNOT_READ_FILE);
}
}
if (fp == NULL) {
fprintf(stderr, "Error: file error!\n");
exit(ERROR_CANNOT_READ_FILE);
}
return fp;
}
int main(int argc, char* argv[]) {
FILE *fp = open_file(argc > 1 ? argv[1] : NULL, stdin, "r");
// some stuff...
if(!fclose(fp)) {
exit(EXIT_FAILURE);
}
}
在这个例子中,我可能对fclose
. 我既不能关闭,也不能stdin
关闭stdout
。我怎样才能正确和有条件地关闭fp
?
我必须关闭fp
吗?
解决方案
如果文件成功关闭但在您的代码中,则 fclose() 返回 0
if(!fclose(fp)) {
exit(EXIT_FAILURE);
}
如果 fclose() 成功关闭文件 main() 返回 EXIT_FAILURE,因此您可以将其更改为
if(fclose(fp)) {
exit(EXIT_FAILURE);
}
或者
if(fclose(fp)!=0){
exit(EXIT_FAILURE);
}
编辑:
问题更多:如果 fp 不是标准输入或标准输出,我必须关闭它吗?
if( (fp!=stdin) && (fp!=stdout) )
if( fclose(fp) )
exit(EXIT_FAILURE);
或者
if( (fp!=stdin&&fp!=stdout) && fclose(fp) )
exit(EXIT_FAILURE);
因为 && 是一个短路运算符并保证从左到右的评估
推荐阅读
- python - 右键单击pynput
- html - 如何修复聊天 UI 底部的文本区域?
- node.js - 将照片添加到 mongodb 中的用户集合
- r - 如何检查我是否在 R 的矩阵中重复元素(检查行和列)?
- java - 是否可以在 Windows Powershell 脚本中嵌入 jar 文件?
- javascript - 单击搜索栏重新启动视频而不是搜索
- discord.js - 如何检查具有特定角色的成员是否存在于 discord.js 的特定语音通道中
- reactjs - React Navigation 5:如何将路线与其他选项放在一起
- amazon-elastic-beanstalk - 没有负载均衡器的 Elastic Beanstalk 别名
- python - 在 mininet 主机中运行 TCP server-client