如何在C中正确关闭文件

如何在C中正确关闭文件,c,file-io,C,File Io,我通常从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", filena

我通常从
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_失败,因此您可以将其更改为

 if(fclose(fp)) {
   exit(EXIT_FAILURE);
} 

编辑:


问题更多:如果fp不是stdin或stdout,我必须关闭它吗?


因为&&是一个从左到右的求值

函数,所以在调用
fclose
之前,您是否可以测试
stdin
如果(fp!=stdin&!fclose(fp))…
?您可以关闭
stdin
stdout
中的一个或两个。您可以测试
是否(fp!=stdout).
可以采取多种方法来“我无法关闭stdin和stdout”:您认为这些方法无法关闭。或者关闭它们会导致一些不需要的后续函数(
fclose()
返回错误?)。请展开。问题是:如果不是
stdin
stdout
,我必须关闭
fp
?为什么不能关闭stdin或stdout?
 if(fclose(fp)!=0){
   exit(EXIT_FAILURE);
} 
       if( (fp!=stdin) && (fp!=stdout) )
             if( fclose(fp) )
                 exit(EXIT_FAILURE);
      if( (fp!=stdin&&fp!=stdout) && fclose(fp) )
                   exit(EXIT_FAILURE);