如果使用fopen()以不同模式打开文件,那么是否需要关闭它的时间,或者可以在代码结束时关闭一次?
答案 0 :(得分:4)
每次打开文件时,您将收到不同的文件描述符或文件句柄。因此,如果通过fclose()
打开,则必须使用fopen()
关闭每个文件句柄;如果通过close()
打开,则必须使用open()
关闭。
答案 1 :(得分:3)
open
函数是创建流的fopen
和freopen
函数的基础原语。
int open (const char *filename, int flags[, mode_t mode])
为filename
命名的文件创建并返回一个新文件 descriptor 。参数mode
仅在创建文件时使用,但在任何情况下都不会提供参数。
因此,只要创建open
或fopen
调用新文件描述符,并且这些描述符保持分配,直到程序结束。
函数close
或fclose
关闭文件描述符字段。关闭文件会产生以下后果:
如果您open
或fopen
而不是close
,那么该描述符将不会被清除,并且会一直持续到程序关闭。
如果有大量open
的调用或任何文件可能被多次打开(每次都没有关闭),那么问题就会很严重,那么描述符将被泄露 ,直到操作系统拒绝或无法创建另一个描述符,在这种情况下,对fopen
的调用失败,程序可能崩溃。
在大多数POSIX操作系统(包括Linux和Os X)上,每个进程都分配了一个固定的文件句柄或文件描述符表。这通常约为1024个句柄。当您尝试打开第1025个文件描述符时,操作系统会终止您的进程。
问题几乎可以肯定是您正在泄漏文件句柄。也就是说,句柄正在打开,完成后它们就不会被关闭。
要避免描述符泄漏,您必须在每次重新打开文件之前close
或fclose
。
看看GNU描述的Opening and Closing Files。
答案 2 :(得分:1)
你必须关闭所有这些。
当您使用open
- 系列系统调用时,他们会返回file-descriptor
(fopen
返回FILE*
,它基本上是一个包含文件描述符的结构。查看FILE定义。)
typedef struct
{
short level ;
short token ;
short bsize ;
char fd ; <-- here
unsigned flags ;
unsigned char hold ;
unsigned char *buffer ;
unsigned char * curp ;
unsigned istemp;
}FILE ;
结果fopen()
你会给你两个不同的FILE *(显然是不同的文件描述符),你最终应该close()/fclose()
。