首页 > 解决方案 > 如何在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吗?

标签: cfile-io

解决方案


如果文件成功关闭但在您的代码中,则 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);

因为 && 是一个短路运算符并保​​证从左到右的评估


推荐阅读