如果没有正确使用fclose函数,会怎样?

yzc_1991 2013-08-13 07:11:00
一个很老的帖子
关于文件打开后写入数据未关闭而再次打开再次写入数据的问题


想问一下,上面那个帖子中二楼给出的几个测试程序,是如何工作的?
代码1
my_file = fopen("11.txt", "w");

fprintf(my_file,"start!\n");
//fclose(my_file);//在此处不关闭文件

my_file = fopen("11.txt", "a");
fprintf(my_file,"my file\n");
fclose(my_file);

代码2
my_file = fopen("11.txt", "w");

fprintf(my_file,"start!\n");
fclose(my_file);//在此处不关闭文件

my_file = fopen("11.txt", "a");
fprintf(my_file,"my file\n");
//fclose(my_file);

代码3
my_file = fopen("11.txt", "w");

fprintf(my_file,"start!\n");
//fclose(my_file);//在此处不关闭文件

my_file = fopen("11.txt", "a");
fprintf(my_file,"my file\n");
//fclose(my_file);

代码4
my_file = fopen("11.txt", "a");//此处也已追加方式

fprintf(my_file,"start!\n");
//fclose(my_file);//在此处不关闭文件

my_file = fopen("11.txt", "a");
fprintf(my_file,"my file\n");
fclose(my_file);


...全文
1729 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
橡皮擦 2013-08-14
  • 打赏
  • 举报
回复
fopen函数打开一个文件,操作系统会分配文件描述符和I/O缓存,还有其他的一些东西,而fclose函数会关闭该文件描述符,并释放内存,所以,如果一个服务器程序不关闭打开的文件,会造成内存泄漏(此处先借用这个词语),还有会因为操作系统因没有文件描述符可用而不能继续打开文件 楼主最好去看下FILE这个结构体类型中的实际内容,有助于了解文件IO的一些事情
Caworb 2013-08-14
  • 打赏
  • 举报
回复
个人感觉系统会存储一个文件描述符表在当前的程序分页空间内,重复打开(未关闭状况)同一个文件可能会因为Lock机制打开失败,不关闭的话也会泄露吧~个人想法,有何不对的地方烦请指出!谢谢~
赵4老师 2013-08-14
  • 打赏
  • 举报
回复
用fflush代替。
lpcads 2013-08-14
  • 打赏
  • 举报
回复
引用 7 楼 DuanXu1 的回复:
[quote=引用 6 楼 AnYidan 的回复:] K&R Chapter 7 - Input and Output Input and output are not part of the C language itself,
这是ANSI C之前的情况[/quote] 第二版封面上印着一个大大的 ANSI C
yzc_1991 2013-08-14
  • 打赏
  • 举报
回复
引用 8 楼 a971124568 的回复:
fopen函数打开一个文件,操作系统会分配文件描述符和I/O缓存,还有其他的一些东西,而fclose函数会关闭该文件描述符,并释放内存,所以,如果一个服务器程序不关闭打开的文件,会造成内存泄漏(此处先借用这个词语),还有会因为操作系统因没有文件描述符可用而不能继续打开文件 楼主最好去看下FILE这个结构体类型中的实际内容,有助于了解文件IO的一些事情
gcc和VC中:
struct _iobuf {
        char *_ptr;   //文件输入的下一个位置
        int   _cnt;  //当前缓冲区的相对位置
        char *_base;  //指基础位置(即是文件的其始位置) 
        int   _flag;  //文件标志
        int   _file;   //文件的有效性验证
        int   _charbuf;  //检查缓冲区状况,如果无缓冲区则不读取
        int   _bufsiz;   //文件的大小
        char *_tmpfname;  //临时文件名
        };
typedef struct _iobuf FILE;

TC中:
typedef struct  {
        short           level;          /* fill/empty level of buffer */
        unsigned        flags;          /* File status flags    */
        char            fd;             /* File descriptor      */
        unsigned char   hold;           /* Ungetc char if no buffer */
        short           bsize;          /* Buffer size          */
        unsigned char   *buffer;        /* Data transfer buffer */
        unsigned char   *curp;          /* Current active pointer */
        unsigned        istemp;         /* Temporary file indicator */
        short           token;          /* Used for validity checking */
}       FILE;                           /* This is the FILE object */

虽然各个编译器对FILE的定义不大相同,但是FILE结构通常会包含:
一个文件位置指示器,指向流的当前位置,错误指示器,文件结尾指示器,
一个指向缓冲区起始处的指针,一个文件标识符和一个记录实际复制到缓冲
区中的字节数的计数器等。
shiguojie19892 2013-08-14
  • 打赏
  • 举报
回复
不关闭就是没有释放指针,如果意外用到了这个指针就会对文件造成修改。
  • 打赏
  • 举报
回复
本人的经验,100多个以后才会出问题。 因为遍历文件,逐个处理用到过。
yzc_1991 2013-08-13
  • 打赏
  • 举报
回复
引用 6 楼 AnYidan 的回复:
K&R Chapter 7 - Input and Output Input and output are not part of the C language itself,
这是ANSI C之前的情况
AnYidan 2013-08-13
  • 打赏
  • 举报
回复
K&R Chapter 7 - Input and Output Input and output are not part of the C language itself,
求知也无涯 2013-08-13
  • 打赏
  • 举报
回复
close的一刹那会刷新缓冲,如果没有正确的close,同时又用那个FILE指针的话,那么就会被覆盖。。。 exit()函数在调用的时候会把所有没有close的FILE指针全部close,故而所有的文件一般都会被正常写入。。。
mujiok2003 2013-08-13
  • 打赏
  • 举报
回复
我认为:不确定。 1. 是否可以同时多次fopen一个文件取决于操作系统,而不是C语言。 2. 缓冲机制和与对应文件关联的设备有关:全缓冲,无缓冲,行缓冲,缓冲的大小。 你可以研究某个平台是如何实现的,但是不可以把结论推广到其他平台。
yzc_1991 2013-08-13
  • 打赏
  • 举报
回复
代码1
my_file = fopen("11.txt", "w"); 
 
fprintf(my_file,"start!\n"); 
        //fclose(my_file);//在此处不关闭文件 
 
my_file = fopen("11.txt", "a"); 
fprintf(my_file,"my file\n"); 
fclose(my_file);
比如上面的代码为什么得到的是 start!
yzc_1991 2013-08-13
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:

打开文件和关闭文件都是比较耗时的。
如果可以不关闭也没有多大关系的!

只要你在下次对文件进行操作的时候注意文件流句柄的位置就好,

防止覆写或者读到空白数据就好!
主要是不理解其中缓存和刷新缓存的机制
max_min_ 2013-08-13
  • 打赏
  • 举报
回复

打开文件和关闭文件都是比较耗时的。
如果可以不关闭也没有多大关系的!

只要你在下次对文件进行操作的时候注意文件流句柄的位置就好,

防止覆写或者读到空白数据就好!

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧