如何在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);