为什么一定要调用fclose函数
为什么一定要调用fclose函数
带缓存的文件操作是标准C 库的实现,第一次调用带缓存的文件操作函数时标准库会自动分配内存并且读出一段固定大小的内容存储在缓存中。所以以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的(何时从硬盘中读取文件或者向硬盘中写入文件有标准库的机制控制)。当缓存区域中的内容达到一定大小时,标准库会将该缓存内容刷新到磁盘上,此时才完成文件的真正写入。
当调用fopen对文件进行写操作时,如果在写的过程中,程序异常退出时,由于缓存区的空间一般都比较大(自己的电脑上测试大概在7,8M左右),之前写入的内容只是存在于缓存区中,并没有真正输出到磁盘的文件里。此时如果在程序退出前调用fclose函数,有两点好处:
(1)将缓存区中的内容立刻刷到磁盘文件里,避免文件没有写入;
(2)释放文件指针。
当调用fopen对文件进行读操作时,还是要调用fclose来关闭文件指针,这是因为fopen函数打开一个文件,操作系统会分配文件描述符和I/O缓存,还有其他的一些东西,而fclose函数会关闭该文件描述符,并释放内存。所以,如果一个程序不关闭打开的文件,会造成内存泄漏(此处先借用这个词语),还有会因为操作系统因没有文件描述符可用而不能继续打开文件(后续再用fopen打开文件,返回的FILE*都为NULL)。
在我的电脑上(WIN7 64位,8G)测试,最多可以打开508个文件而不关闭文件指针,当再打开第509个文件时,文件指针返回为空。
此时,GetLastError() == 2,系统找不到指定的文件。
为什么一定要调用fclose函数相关推荐
- C语言学习笔记---文件操作 fopen()函数 和 fclose()函数
fopen()函数 在C语言中fopen()函数用来打开文件.该函数声明在stdio.h中.它的第一个参数是待打开文件的名称,更确切的说是一个包含文件名的字符串地址.第二个参数是一个字符串,指定待 ...
- C语言的fclose()函数
C语言的fclose()函数 头文件:#include <stdio.h> 定义函数:int fclose(FILE * stream); 函数说明:fclose()用来关闭先前fopen ...
- c语言 fopen、fwrite、fread、fclose函数(打开文件进行读写覆盖或追加)
文章目录 fopen函数 描述 声明 参数 返回值 实例 fwrite函数 描述 声明 参数 返回值 实例 fread函数 描述 声明 参数 返回值 实例 fclose函数 描述 声明 参数 返回值 ...
- C++调用MATLAB函数
MATLAB具有着很高的计算性能,一些算法用MATLAB很容易实现,而用C++很难实现,如果想在C++中调用MATLAB编写的函数,可以将该函数编译成库文件,之后在C++中对其进行调用. 本文详细讲解 ...
- 点击按钮执行php函数,从表单按钮调用PHP函数
搜索热词 好吧,我的脚本应该看起来像那样.我必须主要在PHP中进行操作.按钮添加应将数据保存到文件,显示应读取该文件并将其放入textarea,删除必须删除所选行,然后重置将重置所有内容. $plik ...
- 怎么在php中调用js函数,如何从PHP调用JS函数?
我有一个php页面,上面有一个html按钮,在那里我应该JS用php变量调用一个函数.我得到了错误 变量未定义 这是代码: if(file_exists('megjelenitendo.txt')){ ...
- C语言fclose()函数:关闭文件流
头文件:#include <stdio.h> fclose()函数用来关闭当前文件流,其原型为: int fclose(FILE * stream); [参数]stream为文件流 ...
- 源码解析glibc中的pclose与fclose函数
文章目录 pclose 和 fclose 的阻塞问题 测试代码 问题 pclose与fclose的关系 fclose函数的定义 pclose函数的定义 总结 fclose中的block 有嫌疑的地方 ...
- 如何在sqlite3连接中创建并调用自定义函数
#!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sql ...
最新文章
- 静态库和共享库之间的区别?
- 正则表达式原理及引擎实现
- spark 朴素贝叶斯
- python多线程网络编程_python之网络编程-多线程
- Bit-Z如何注册?【新手操作指南】
- [四校联考P3] 区间颜色众数 (主席树)
- linux进程---exec族函数(execl, execlp, execv, execvp, )解释和配合fork的使用
- java+tableseg,多种功能集成,带Refresh刷新的tableV,Seg分段控件
- 无需代码绘制出的热力图,0基础小白也能3分钟上手
- 筛选数据库_快速研读国外专利,轻松筛选核心技术…研发人必看6大数据库实用功能盘点!...
- 通过cmd命令行开启计算机xx服务
- SQL数据库异地备份(小白篇)两台服务器之间备份
- linux socket 程序被ctrl+c或者异常终止,提示:bind error:Address already in use,解决办法...
- 韦东山freeRTOS系列教程之【第三章】任务管理
- padavan mysql密码_[教程][搭建网站网盘] Padavan固件一键安装ONMP搭建Web环境,网站,网盘,相册等...
- 国开电大0-3岁婴幼儿的保育与教育形考任务
- CSS3边框图片效果
- 小程序获取用户信息相关 获取头像名称 微信用户
- (小白)Excel学习笔记
- HSSFCellStyle相关属性报错
热门文章
- 【KEIL5】是时候给你的Keil换个好看的皮肤了(MDK)
- 将一个字符串首字母转大写(英文)
- SpringBoot2.X监控和管理神器:SpringBoot Admin
- 【Java】动态模拟时钟
- linux 获得磁盘 寻道时间,Linux入门篇 —— Linux 磁盘管理之磁盘理论篇 | 七日打卡...
- MT5 EA交易期货-限价单开仓平仓
- 基于HCL的xx大学校园网设计与配置
- python rot13解密_ROT13 加密与解密
- ReportViewer在Chrome 浏览器中无法显示的解决方法
- C语言进阶之自定义类型:结构体,枚举,联合