当前位置: 首页 > news >正文

C语言中的文件操作

1.为什么使用文件如果没有文件我们写的程序是储存在电脑的内存中当程序退出时内存被回收数据也就丢失了。为了使数据能够持久的保存我们就可以使用文件。2. 什么是⽂件磁盘硬件)上的文件时文件。在程序设计中一般谈的文件有两种程序文件数据文件。2.1 程序⽂件程序文件包含源程序文件后缀为.c目标文件Windows环境后缀为.obj)可执行文件 Windows环境后缀为.exe)。2.2数据⽂件⽂件的内容不⼀定是程序⽽是程序运⾏时读写的数据⽐如程序运⾏需要从中读取数据的⽂件或 者输出内容的⽂件。2.3 ⽂件名⼀个⽂件要有⼀个唯⼀的⽂件标识以便⽤⼾识别和引⽤。⽂件名包含3部分⽂件路径⽂件名主⼲⽂件后缀例如 c:\code\test.txt3. ⼆进制⽂件和⽂本⽂件根据数据的组成形式数据文件分为文本文件二进制文件。数据在内存中以二进制的形式存储如果不加转换的输出到外部的文件中就是二进制文件。以ASCII字符的形式存储的⽂件就是⽂ 本⽂件。字符在文件中⼀律以ASCII形式存储数值型数据既可以⽤ASCII形式存储也可以使⽤⼆进制形式存储。4. ⽂件的打开和关闭在上图中引入了流那么流是什么呢4.1 流和标准流流我们程序的数据需要输出到各种外部设备也需要从外部设备获取数据不同的外部设备的输⼊输出 操作各不相同为了⽅便程序员对各种设备进⾏⽅便的操作我们抽象出了流的概念我们可以把流 想象成流淌着字符的河。标准流C语言程序在启动时默认会打开3个流stdin- 标准输⼊流在⼤多数的环境中从键盘输⼊scanf函数就是从标准输⼊流中读取数据。stdout- 标准输出流⼤多数的环境中输出⾄显⽰器界⾯printf函数就是将信息输出到标准输出 流中。stderr- 标准错误流⼤多数环境中输出到显⽰器界⾯。stdin,stdout,stderr的类型为FILE*通常叫做文件指针。通过FILE*来对流进行维护。4.2 ⽂件指针每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区⽤来存放⽂件的相关信息如⽂件的名 字⽂件状态及⽂件当前的位置等。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系 统声明的取名FILE.FILE*pf;定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区是⼀个结构体变 量。通过该⽂件信息区中的信息就能够访问该⽂件。通过⽂件指针变量能够间接找到与 它关联的⽂件。4.3 ⽂件的打开和关闭⽂件在读写之前应该先打开⽂件在使⽤结束之后应该关闭⽂件。ANSI C规定使⽤ fopen 函数来打开⽂件 fclose 来关闭⽂件。fopenFILE * fopen(const char *filename,const char *mode);功能后续对流的操作是通过 filename 指定的⽂件同时将打开的⽂件和⼀个流进⾏关联 fopen 函数返回的指针来维护。具体对流关联的⽂件的操作是通过参数 mode 来指定的。参数filename 表⽰被打开的⽂件的名字这个名字可以绝对路径也可以是相对路径。 mode 表⽰对打开的⽂件的操作⽅式具体⻅下⾯的表格。返回值若⽂件成功打开该函数将返回⼀个指向 则返回 FILE 对象的指针该指针可⽤于后续操作中标识对应的流。若打开失败则返回 FILE 指针所以⼀定要对 fopen 的返回值做判断来验证⽂件是否打开成 功。文件使用方式含义如果指定文件不存在“r只读为了输入数据打开一个已经存在的文本文件出错w只写为了输出数据打开一个文本文件若文件存在会清空该文件内的所以数据建立一个新的文件a追加向文本文件尾添加数据建立一个新的文件rb只读为了输⼊数据打开⼀个⼆进制⽂件出错wb只写为了输出数据打开⼀个⼆进制⽂件建立一个新的文件ab追加向⼀个⼆进制⽂件尾添加数据建立一个新的文件r读写为了读和写打开⼀个⽂本⽂件出错w读写为了读和写打开⼀个⽂本⽂件建立一个新的文件a”读写打开⼀个⽂件在⽂件尾进⾏读写建立一个新的文件“rb读写为了读和写打开⼀个⼆进制⽂件出错wb读写为了读和写新建⼀个新的⼆进制⽂件建立一个新的文件ab读写打开⼀个⼆进制⽂件在⽂件尾进⾏读和写建立一个新的文件fclose功能关闭参数 stream 关联的⽂件并取消其关联关系。与该流关联的所有内部缓冲区均会解除关 联并刷新任何未写⼊的输出缓冲区内容将被写⼊任何未读取的输⼊缓冲区内容将被丢弃。参数 stream 指向要关闭的流的 FILE 对象的指针返回值成功关闭 stream 指向的流会返回0否则会返回 EOF 。5. ⽂件的顺序读写在进⾏⽂件读写的时候会涉及下⾯这些函数函数名功能适用于fgetc从输⼊流中读取⼀个字符所有输⼊流fputc向输出流中写⼊⼀个字符所有输出流fgets从输⼊流中读取⼀个字符串所有输⼊流fputs向输出流中写⼊⼀个字符串所有输出流fscanf从输⼊流中读取带有格式的数据所有输⼊流fprintf向输出流中写⼊带有格式的数据所有输出流fread从输⼊流中读取⼀块数据文件输⼊流fwrite向输出流中写⼊⼀块数据文件输出流feof和ferrorint feof ( FILE * stream );检测 stream 指针指向的流是否遇到⽂件末尾int ferror ( FILE * stream );检测 stream 指针指向的流是否发⽣读 / 写错误fwritesize_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );功能函数⽤于将数据块写⼊stream 指向的⽂件流中是以2进制的形式写⼊的。注意需要包含 stdio.h头⽂件。• 在使⽤ fwrite() 之前需要确保⽂件已经以⼆进制可写⽅式打开。• fwrite() 通常⽤于⼆进制数据的写⼊如果写⼊⽂本数据请谨慎处理换⾏符和编码等问题。freadsize_t fread ( void * ptr, size_t size, size_t count, FILE * stream );功能函数⽤于从 stream 指向的⽂件流中读取数据块并将其存储到 ptr 指向的内存缓冲区中.返回值返回实际读取的数据块数量。注意需要包含 头⽂件。在使⽤ fread() 之前需要确保⽂件已经以⼆进制可读⽅式打开。• ptr 指向的内存区域必须⾜够⼤以便存储指定数量和⼤⼩的数据块。• 如果 f read() 成功读取了指定数量的数据块则返回值等于 count 如果读取数量少于 count 则可能已经到达⽂件结尾或者发⽣了错误。在⼆进制⽂件读取时 fread() 是常⽤的函数但对于⽂本⽂件读取通常使⽤ fgets() fscanf() 。scanf针对标准输入stdin格式化的输入函数printf针对标准输出stdout格式化的输出函数fscanf针对所以输入流的格式化输入函数fprintf针对所以输出流的格式化输出函数sscanf从字符串中解析格式化的数据sprintf把格式化的数据转化为字符串6.⽂件的随机读写6.1fseekint fseek ( FILE * stream, long int offset, int origin );功能根据⽂件指针的位置和偏移量来定位⽂件指针⽂件内容的光标。参数stream 指向FILE类型结构体的指针指定了要定位⽂件指针的⽂件流。offset 偏移量这个偏移量要根据第三个参数来确定取值可以是正数向⽂件末尾⽅向移 动、负数向⽂件开头⽅向移动或0不移动。origin 偏移的起始点基准位置这个参数有三个取值SEEK_SET ⽂件开始位置SEEK_CUR ⽂件指针当前的位置SEEK_END ⽂件末尾位置返回值成功如果⽂件位置指针被成功移动 fseek 返回0。失败如果发⽣错误例如试图移动到⼀个不存在的负偏移位置则返回⾮零值通常是-1。⼆进制⽂件vs⽂本⽂件◦ ◦ 对于⼆进制⽂件 fseek 的⾏为⾮常直观可以精确地移动到任何字节位置。 对于⽂本⽂件 ▪ fseek 的⾏为在某些环境下可能不确定因为换⾏符的转换等问题。唯⼀ 被严格保证的⽤法是 将 offset 设置为0 origin 设置为SEEK_SET 即移动到⽂件开头。将 offset 设置为 ftell() 的返回值 ftell 返回当前指针位置6.2 ftelllong int ftell ( FILE * stream );功能返回⽂件指针相对于起始位置的偏移量参数 stream :指向⼀个已打开⽂件的⽂件指针。返回值成功返回当前⽂件位置指针相对于⽂件开头的偏移量字节数类型为 long int失败如果发⽣错误例如⽂件流⽆效或⽂件不⽀持定位则返回-1。6.3 rewindvoid rewind ( FILE * stream );功能让⽂件指针的位置回到⽂件的起始位置参数 stream :指向⼀个已打开⽂件的⽂件指针。清除错误标志rewind 不仅移动⽂件指针还会清除⽂件的错误标志和⽂件结束标志。这意味着即使在读取⽂件时遇到了错误或到达了⽂件末尾调⽤ rewind 后⽂件状态会被重置可以重新开始操作。与 fseek 的区别fseek(fp, 0, SEEK_SET) 只移动⽂件指针不清除错误标志。rewind(fp) 移动⽂件指针并清除错误标志。7. ⽂件缓冲区ANSI C标准采⽤“缓冲⽂件系统”处理数据⽂件的所谓缓冲⽂件系统是指系统⾃动地在内存中为程 序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲 区装满缓冲区后才⼀起送到磁盘上。7.1 fflushint fflush ( FILE * stream );功能强制刷新参数stream 指定流的缓冲区确保数据写⼊底层设备。对输出流将缓冲区中未写⼊的数据⽴即写⼊⽂件。对输⼊流⾏为由具体实现决定⾮C语⾔标准⾏为可能清空输⼊缓冲区参数为NULL 时刷新所有打开的输出流返回值成功返回 0 失败返回 EOF结论因为有缓冲区的存在C语⾔在操作⽂件的时候需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂件。如果不做可能导致读写⽂件的问题。
http://www.zskr.cn/news/1380926.html

相关文章:

  • 海水缸自动化系统设计:从硬件选型到智能控制逻辑全解析
  • AIGC率 -- 如何降的更自然
  • 你的PyTorch MNIST项目还在用CPU跑?保姆级教程教你用Google Colab免费GPU加速训练(附完整代码)
  • 2000-2024年上市公司海外子公司存活率数据
  • 2001-2025年A股上市公司分行业分地区主营业务构成
  • 前端项目 Docker 镜像构建完整操作总结
  • yolo26 语义分割特征融合:全网首发--使用 LCA 模块改进 Neck 多尺度特征融合能力 ✨
  • BiliBiliCCSubtitle终极指南:如何一键下载B站字幕并转换为SRT格式
  • AI黄金年代、专家系统与AI寒冬
  • BurpSuite进阶指南:以漏洞生命周期重构攻防思维
  • 告别Windows文件搜索慢!Listary 6保姆级配置教程,让你的文件秒出结果
  • 杭州上城慧启装饰装修:德清专业的双玻百叶隔断施工公司有哪些 - LYL仔仔
  • 神经网络量化技术:动态位宽调整与TruncQuant实现
  • 7步彻底解决软件加载故障:从诊断到根治的完整指南
  • 不只是安装!OpenEuler欧拉系统U盘启动盘制作与磁盘分区实战指南
  • Whisper-WebUI架构深度解析:模块化语音转录系统的技术实现
  • 5分钟掌握Pearcleaner:开源Mac应用彻底清理的完整解决方案
  • Taotoken透明计费与详细账单助力企业财务审计与报销
  • 别再死记硬背MDP公式了!用Python+PyTorch手搓一个“超级玛丽”AI,实战理解强化学习核心
  • 滨江郦城相关房产经纪机构怎么选?2026年决策路径全解析 - 资讯纵览
  • Untrunc视频修复指南:当珍贵视频突然损坏时,如何用开源工具拯救你的数字回忆
  • 3步快速破解极域电子教室:终极指南与完整方案
  • 结肠“瑞士卷”制片法
  • 不是把Prompt存到表里就叫版本管理,一套让AI应用敢上线、敢灰度、敢回滚的工程体系
  • 代付与分账的区别
  • 3分钟掌握Windows任务栏美化终极技巧:TranslucentTB完整中文界面设置指南
  • 10分钟精通Switch手柄PC连接:BetterJoy完全配置指南
  • HTTPCanary+VMOS Pro抓包失败的5个高频配置坑
  • 德州黄金回收哪家靠谱?高价无套路本地正规门店上门回收 - 鑫顺黄金回收
  • AutoGen 多模态支持:让 AI Agent Harness Engineering 处理文本、图像与语音任务