文件io-fclose

本文详细解释了fclose在C语言中的作用,包括文件缓冲区的工作原理,以及为何在程序结束前调用fclose以确保数据写入磁盘和释放资源。还强调了fclose对于防止内存泄漏和保持文件描述符可用性的必要性。
摘要由CSDN通过智能技术生成

fclose文件的关闭操作

关闭指定文件,必要时刷新缓冲区。成功关闭返回0,失败EOF。

如果磁盘满了,移动硬盘被移除或出现I/O错误,都会导致调用失败。

代码说明:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *file;
    //使用a追加
    file =fopen("E:\\C\\vscode\\C\\demo\\qiniuschool\\user.txt", "a");
    if(!file)
    {
        puts("file open fail!ERROR!");
    }else{
        puts("Open success");
    }

    fputs("\nnike nike123",file);

    system("pause");
    puts("1-paused,it will be closed if you puase again.");

    puts("2-pause,will read fclose function");
    system("pause");
    
    fclose(file);
    puts("3-pause,file closed!");
    system("pause");
    

    return 0;
}

user.txt

admin       123456
root        root123
xiaoming    xiaoming123

原本只有三行数据,

执行到fputs(),进行数据写入,但是不会直接写入,而是写到缓冲区

缓冲区写入到文件

有三种写入情况:文件结束,fclose(),fflush().

继续代码说明:

1、fclose();写入数据

第一次pause的时候,没有读到fclose,文本中没有数据写入

第二次pause的时候,缓冲区的数据遇见fclose(),读入到文本,

此时就写入了

admin       123456
root        root123
xiaoming    xiaoming123
nike nike123

第三次pause时候,结束程序

2、但是不使用fclose()也可以写入数据

满足上面说的三种情况中的,当我们pause三次的时候,结束就写入了

admin       123456
root        root123
xiaoming    xiaoming123
nike nike123

那我们为什么要用fclose

带缓存的文件操作是标准C 库的实现,第一次调用带缓存的文件操作函数时标准库会自动分配内存并且读出一段固定大小的内容存储在缓存中。所以以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的(何时从硬盘中读取文件或者向硬盘中写入文件有标准库的机制控制)。当缓存区域中的内容达到一定大小时,标准库会将该缓存内容刷新到磁盘上,此时才完成文件的真正写入。

之前写入的内容只是存在于缓存区中,并没有真正输出到磁盘的文件里。此时如果在程序退出前调用fclose函数,有两点好处:
(1)将缓存区中的内容立刻刷到磁盘文件里,避免文件没有写入;
(2)释放文件指针。

当调用fopen对文件进行读操作时,还是要调用fclose来关闭文件指针,这是因为fopen函数打开一个文件,操作系统会分配文件描述符和I/O缓存,还有其他的一些东西,而fclose函数会关闭该文件描述符,并释放内存。所以,如果一个程序不关闭打开的文件,会造成内存泄漏(此处先借用这个词语),还有会因为操作系统因没有文件描述符可用而不能继续打开文件(后续再用fopen打开文件,返回的FILE*都为NULL)。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值