初学c语言21(文件操作)
一.为什么使用文件
之前我们写的程序的数据都是存储到内存里面的,当程序结束时,内存回收,数据丢失,
再次运行程序时,就看不到上次程序的数据,如果要程序的数据一直保存得使用文件
二.文件
文件一般可以分为俩种:
1.程序文件
包括源程序文件(后缀为 .c)、目标文件(Windows环境下后缀为 .obj)、可执行程序(Windows环境下后缀为 .exe)
2.数据文件
文件的内容不一定是程序文件,而是程序运行时读写的文件,比如程序运行时需要从中读取数据的文件或输出的文件,举例如下:
三.数据在文件中是怎么存储的?
数据在内存是以二进制形式存储,而在文件中:
字符一律按ASCLL码值形式存储
数值型数据既可以以ASCLL码值形式存储,也可以以二进制形式存储
举例:
如10000,以ASCLL码值形式存储到磁盘,在磁盘上占5个字节(一个字符一个字节),以二进制形式存储,占4个字节,图像如下:
四.二进制文件和文本文件
数据在内存是以二进制形式存储,如果不加以转化就输出到外存的文件,就是二进制文件,
以ASCLL码值形式存储的文件为文本文件
五.流和标准流
1.流
程序的数据要输出到各种设备,也需要从外部设备获取数据,由于设备的不同导致输入输出操作不同,为了方便就有了流的概念,c程序对文件、键盘等进行输入输出操作都是通过流操作的
一般情况下,向流中输入输出数据都是先打开流,在进行操作
2.标准流
之前的scanf函数从键盘输入信息、primtf函数向屏幕输出信息等却没看见打开流,是因为c程序在启动的时候默认打开了三个流:
stdin ---标准输入流,大多数环境下从键盘上输入,scanf就是从标准输入流中读取数据的
stdout ---标准输出流,大多数环境下从屏幕上输出,printf就是将信息输出到标准输出流中
stderr ---标准错误流,大多数环境下从屏幕上输出
六.文件指针
每打开一个文件,系统就会根据文件情况自动创建FILE结构体变量,并填充其中的信息,一般都是通过一个FILE的指针来维护其结构变量,即文件指针,该指针可以找到与它关联的文件
七.文件的打开和关闭
文件在读写前应该打开文件,使用结束后关闭文件,不然会造成内存泄漏,数据丢失等
ANSIC规定使用fopen打开文件,fclose关闭文件
1.fopen
形式:
功能:
打开fileaname指定的文件,同时将文件和一个流进行关联,后续对流的操作是通过函数返回的指针进行维护的(如fputc、fputs等),具体对流(关联的文件)的操作是通过参数mode来指定的
参数:
filename:表示打开文件的名字,可以是相对路径,也可以是绝对路径
mode:表示打开文件的操作方式
返回值:
打开文件成功返回一个指向FILE结构体的指针,通过操作流(统一接口)指向文件信息区,关联到此文件
失败时返回NULL,所以每次打开文件都要检查是否打开成功
文件打开方式(mode参数)
模式 | 描述 | 文件存在 | 文件不存在 |
“ r ” | 只读 | 正常打开文件 | 返回NULLL |
“ w ” | 只写(覆盖) | 清空文件类容 | 创建新文件 |
" a " | 追加写入(从末尾) | 从末尾写入 | 创建新文件 |
" r+ " | 读写(从开头) | 正常打开文件 | 返回NULL |
" w+ " | 读写(覆盖) | 清空文件类容 | 创建新文件 |
" a+ " | 读写(追加) | 从末尾写入 | 创建新文件 |
"rb""wb"等 | 二进制模式(加b) | 同上 | 同上 |
2.fclose
形式:
功能:
关闭参数steam关联的文件,并取消其关联关系。与该流关联的内部缓冲区解除关联并刷新(将为写入磁盘的输入缓冲区的类容写入,将未读取的输出缓冲区的类容丢弃)所以文件指针会变为野指针,得及时置为NULL
参数:
steam:指向要关闭文件流的FILE结构体的指针
返回值:
关闭成功返回0,否则返回EOF
应用举例:
. ----表示当前路径
.. ----表示上一级路径
/ ----表示分割目录层级
相对文件举例:data.txt(表示当前路径的data.txt)或(./../data.txt)
绝对路径举例:C:\Users\xxx\Desktop
八.文件的顺序读写
函数名 | 功能 | 适用于 |
fgetc | 从输入流读取一个字符 | 所有输入流 |
fputc | 向输出流写入一个字符 | 所有输出流 |
fgets | 从输入流读取一个字符串 | 所有输入流 |
fputs | 向输出流写入一个字符串 | 所有输出流 |
fscanf | 从输入流读取带有格式的数据 | 所有输入流 |
fprintf | 向输出流写入带有格式的数据 | 所有输出流 |
fread | 从输入流读取一块数据 | 文件输入流 |
fwrite | 向输出流写入一块数据 | 文件输出流 |
1.fputc
形式:
功能:
将参数character指定的字符写入到stream指定的输出流里,字符会被写入内部指示器当前指向的位置(如有字符将被覆盖),写入后指示器向前移动一个位置
参数:
character:被写入的字符
steam:指针,指向了输出流
返回值:
写入成功返回写入的字符(int形式的)
失败时返回EOF(通常为-1)
应用:
2.fgetc
形式:
功能:
从参数stream指定的输入流读取字符,读取当前指示器指向的字符后,指示器也会向前移动一个位置
参数:指针,指向了输入流
返回值:
读取成功时返回读取的字符(int类型的)
读取失败或读取到文件末尾时返回EOF
应用:
2.feof和ferror
feof
形式:
功能:
检测stream指针指向的流是否遇到了文件末尾。如果在读取文件到末尾的时候,读取就会停止,这时读取函数就会在对应的流上设置一个文件结束的指示符,这个指示符会被 feof() 检测到,如果检测到指示符就返回非0的值,否则返回0
ferror
形式:
功能:
检测stream指针指向的流是否读/写错误。如果读/写错误,文件读写就会停止,读写函数就会在对应的流上设置一个错误指示符,这个指示符会被ferror检测到,被检测到指示符被设置就会返回非0的值,否则返回0.
应用:
3.fputs
形式:
功能:
将str指向的字符串写入到stream指向的输出流里(不包括文件的控制符\0)
参数:
str:指针,指向要写入的字符串(必须以\0结尾)
stream:指针,指向输出流
返回值:
成功时返回非负数
失败时返回EOF
应用:
4.fgets
形式:
功能:
从stream指定的输入流读取字符串,直至读到换行符、文件末尾、指定字符数(包括结尾\0),然后将读取的字符串存储到str指向的空间里
参数:
str:指向字符数组的指针,用来存储读取的字符
num:最大读取字符数(实际最多读取num-1个,每次读取都会在结尾加\0)
stream:指针,指向输入流
返回值:
成功时返回str
读取到文件末尾或读取错误时返回NULL
应用:
5.fprinrf
形式:
功能:
将格式化数据输出到stream指定的流里
参数:
stream:指针,指向要写入的文件流里
format:格式化字符串(%d、%f等)
.... :提供与格式化字符串中说明符
返回值:
成功时返回写入字符个数
失败时返回负值
应用:

6.fscanf
形式:
功能:
从stream指定的文件流中读取格式化数据的函数
参数:
stream:指针,指向输入流
.... :可变参数列表,提供存储数据的地址
其他和scanf一样
返回值:
成功时返回成功填充到可变参数列表的项数,但可能少于预期,有如下原因:
格式化字符与数据不匹配
读取发生错误
在读取成功前读到文件末尾或读取错误返回EOF
应用:
7.fwrite
形式:
功能:
将ptr指向的数据块(可控制)写入到stream指向的输出流里(以二进制写入,所以得在使用前已二进制可写方式打开)
参数:
ptr:指针,指向要写入的数据块
size:要写入每个数据块的大小(单位字节)
num:要写入数据项的数量
stream:指针,指向了要写入的文件输出流
返回值:
返回写入的项数
应用:
8.fread
形式:
功能:
从stream指定的文件输入流中读取数据块(读取二进制形式文件)
参数:
ptr:指针,指向存储读取的数据的空间
size:要读取每个数据块的大小
count:读取数据块的总量
stream:指针,指向要读取数据的文件流
返回值:
读取的项数
应用:

9.sprintf
形式:
功能:
将格式化数据转化为一个字符串
参数:
str:指针,指向存储生成的字符串
返回值:
成功时返回存储的字符数(不包括\0)
失败时返回负值
应用:
10.sscanf
形式:
功能:
从字符串读取格式化数据
参数:
s:指针,指向要读取的字符串
返回值:
成功时返回解析成功并赋值的项数
失败时返回EOF
应用:
九.文件的随机读取
1.fseek
形式:
功能:
调整文件指示器的位置,可以从想读/写的位置读/写
参数:
stream:指针,指向一个流(如文件流)
origin:文件指示器的初始位置,可设置,有以下可能取值:
‘
offset:相对于origin的偏移量
应用:
2.ftell
形式:
功能:
返回文件指示器相对于起始位置的偏移量
应用:
3.rewind
形式:
功能:
是文件指针回到起始位置
十.文件缓冲区
系统会自动在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据先会送到文件缓冲区,装满后才一起送到磁盘上.
所以在读写模式下,写完后再读,可能数据还没输出到文件,导致读不到数据,以下有个函数可以刷新文件缓冲区,能及时读到数据,
fflush
形式:
功能:
强制刷新stream指定流的缓冲区,但对输入流未定义
参数为NULL时刷新所有打开的输出流
返回值:
成功时返回0,失败时返回EOF
证明代码:
#include <stdio.h>
#include <windows.h>
//VS2022 WIN11环境测试
int main()
{FILE* pf = fopen("dtat.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒-已经写数据了,打开dtat.txt文件,发现文件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)//注:fflush 在⾼版本的VS上不能使⽤了printf("再睡眠10秒-此时,再次打开dtat.txt文件,文件有内容了\n");Sleep(10000);fclose(pf);//注:fclose在关闭⽂件的时候,也会刷新缓冲区pf = NULL;return 0;
}
相关文章:

初学c语言21(文件操作)
一.为什么使用文件 之前我们写的程序的数据都是存储到内存里面的,当程序结束时,内存回收,数据丢失, 再次运行程序时,就看不到上次程序的数据,如果要程序的数据一直保存得使用文件 二.文件 文件一般可以…...
数学复习笔记 21
4.15 稍微有点难啊。克拉默法则忘掉了,然后第二类数学归纳法是第一次见。行列式和矩阵,向量和方程组。这是前面四章。现在考研只剩下一个大题。所以就是考最后两章,特征值和二次型。感觉看网课的作用就是辅助理解,自己看书的话&am…...

华为OD机试真题——数据分类(2025B卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 B卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《数据…...

JavaWeb开发基础Servlet生命周期与工作原理
Servlet生命周期 Servlet的生命周期由Servlet容器(如Tomcat、Jetty等)管理,主要包括以下5个阶段: 加载Servlet类 创建Servlet实例 调用init方法 调用service方法 调用destroy方法 加载(Loading): 当Servlet容器启动或第一次接收到对某个…...

三防平板科普:有什么特殊功能?应用在什么场景?
在数字化浪潮席卷全球的今天,智能设备已成为现代工业、应急救援、户外作业等领域的核心工具。然而,常规平板电脑在极端环境下的脆弱性,如高温、粉尘、水浸或撞击,往往成为制约效率与安全的短板。三防平板(防水、防尘、…...

百度外链生态的优劣解构与优化策略深度研究
本文基于搜索引擎算法演进与外链建设实践,系统剖析百度外链的作用机制与价值模型。通过数据统计、案例分析及算法逆向工程,揭示不同类型外链在权重传递、流量获取、信任背书等维度的差异化表现,提出符合搜索引擎规则的外链建设技术方案&#…...
笔记: 在WPF中ContentElement 和 UIElement 的主要区别
一、目的:简要姐扫在WPF中ContentElement 和 UIElement 的主要区别 ContentElement 和 UIElement 是 WPF 中的两个基类,它们在功能和用途上有显著的区别。 二、主要区别 ContentElement 主要特点: • 没有视觉表示: ContentElement 本身不直接渲染任…...
项目中使用到了多个UI组件库,也使用了Tailwindcss,如何确保新开发的组件样式隔离?
在项目中使用多个组件库,同时使用 TailwindCSS,确保新开发的组件样式隔离是非常重要的。样式隔离可以避免样式冲突、全局污染以及意外的样式覆盖问题。以下是一些常见的策略和最佳实践: 1. 使用 TailwindCSS 的 layer 机制 TailwindCSS 提供…...
AI提示工程(Prompt Engineering)高级技巧详解
AI提示工程(Prompt Engineering)高级技巧详解 文章目录 一、基础设计原则二、高级提示策略三、输出控制技术四、工程化实践五、专业框架应用提示工程是与大型语言模型(LLM)高效交互的关键技术,精心设计的提示可以显著提升模型输出的质量和相关性。以下是经过验证的详细提示工…...

【速写】PPOTrainer样例与错误思考(少量DAPO)
文章目录 序言1 TRL的PPO官方样例分析2 确实可行的PPOTrainer版本3 附录:DeepSeek关于PPOTrainer示例代码的对话记录Round 1(给定模型数据集,让它开始写PPO示例)Round 2 (指出PPOTrainer的参数问题)关键问题…...

5.26 面经整理 360共有云 golang
select … for update 参考:https://www.cnblogs.com/goloving/p/13590955.html select for update是一种常用的加锁机制,它可以在查询数据的同时对所选的数据行进行锁定,避免其他事务对这些数据行进行修改。 比如涉及到金钱、库存等。一般这…...

中国移动咪咕助力第五届全国人工智能大赛“AI+数智创新”专项赛道开展
第五届全国人工智能大赛由鹏城实验室主办,新一代人工智能产业技术创新战略联盟承办,华为、中国移动、鹏城实验室科教基金会等单位协办,广东省人工智能与机器人学会支持。 大赛发布“AI图像编码”、“AI增强视频质量评价”、“AI数智创新”三大…...

模具制造业数字化转型:精密模塑,以数字之力铸就制造基石
模具被誉为 “工业之母”,是制造业的重要基石,其精度直接决定了工业产品的质量与性能。在工业制造向高精度、智能化发展的当下,《模具制造业数字化转型:精密模塑,以数字之力铸就制造基石》这一主题,精准点明…...

PECVD 生成 SiO₂ 的反应方程式
在PECVD工艺中,沉积氧化硅薄膜以SiH₄基与TEOS基两种工艺路线为主。 IMD Oxide(USG) 这部分主要沉积未掺杂的SiO₂,也叫USG(Undoped Silicate Glass),常用于IMD(Inter-Metal Diele…...
React与Vue核心区别对比
React 和 Vue 都是当今最流行、功能强大的前端 JavaScript 框架,用于构建用户界面。它们有很多相似之处(比如组件化、虚拟 DOM、响应式数据绑定),但也存在一些核心差异。以下是它们的主要区别: 1. 核心设计与哲学 Rea…...

2024 CKA模拟系统制作 | Step-By-Step | 17、题目搭建-排查故障节点
目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. Kubernetes 节点状态诊断 2. 节点故障修复技能 3. 持久化修复方案 4. SSH 特权操作 三、考点详细讲解 1. 节点状态机制详解 2. 常见故障原因深度分析 3. 永久修复技术方案 四、实验环境搭建步骤…...

如何将图像插入 PDF:最佳工具比较
无论您是编辑营销材料、写报告还是改写原来的PDF文件,将图像插入 PDF 都至关重要。幸运的是,有多种在线和离线工具可以简化此任务。在本文中,我们将比较一些常用的 PDF 添加图像工具,并根据您的使用场景推荐最佳解决方案ÿ…...
Linux 文件 IO 性能监控与分析指南
Linux 文件 I/O 性能监控与分析指南 继 CPU 和网络之后,文件系统 I/O 是影响系统性能的第三大关键领域。无论是数据库响应缓慢、应用加载时间过长,还是日志写入延迟,其根源都可能指向磁盘 I/O 瓶颈。本章将深入探讨文件 I/O 的核心概念、监控…...
ABP VNext + Apache Flink 实时流计算:打造高可用“交易风控”系统
ABP VNext Apache Flink 实时流计算:打造高可用“交易风控”系统 🌐 📚 目录 ABP VNext Apache Flink 实时流计算:打造高可用“交易风控”系统 🌐一、背景🚀二、系统整体架构 🏗️三、实战展示…...
前端面试题-HTML篇
1. 请谈谈你对 Web 标准以及 W3C 的理解和认识。 我对 Web 标准 的理解是,它就像是互联网世界的“交通规则”,由 W3C(World Wide Web Consortium,万维网联盟) 这样一个国际性组织制定。这些规则规范了我们在编写 HTML…...
JS数组 concat() 与扩展运算符的深度解析与最佳实践
文章目录 前言一、语法对比1. Array.prototype.concat()2. 扩展运算符(解构赋值) 二、性能差异(大规模数组)关键差异原因 三、适用场景建议总结 前言 最近工作中遇到了一个大规模数组合并相关的问题,在数据合并时有些…...

人工智能与机器学习从理论、技术与实践的多维对比
人工智能(Artificial Intelligence, AI)提出“让机器像人类一样思考”的目标,其核心理论围绕符号系统假设展开——认为智能行为可通过逻辑符号系统(如谓词逻辑、产生式规则)建模。 机器学习(Machine Learning, ML)是人工智能的子集,聚焦于通过数据自动改进算法性能的理…...
Netty 实战篇:手写一个轻量级 RPC 框架原型
本文将基于前文实现的编解码与心跳机制,构建一个简单的 RPC 框架,包括请求封装、响应解析、动态代理调用。为打造微服务通信基础打下基础。 一、什么是 RPC? RPC(Remote Procedure Call,远程过程调用)允许…...

什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程
什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程 摘要 WPF教程、WPF开发、.NET 8 WPF、Visual Studio 2022 WPF、WPF下载、WPF安装、WPF配置、WPF样式、WPF样式详解、XAML语法、XAML基础、MVVM架构、数据绑定、依赖属性、资源字典…...
亚远景-ISO 21434标准:汽车网络安全实践的落地指南
一、ISO 21434标准概述 ISO 21434是针对道路车辆网络安全的国际标准,旨在确保汽车组织在车辆的整个生命周期内采用结构化方法进行网络安全风险管理。 该标准适用于参与车辆开发的所有利益相关者,包括OEM、一级和二级供应商、汽车软件供应商以及网络安全…...
【动手学深度学习】2.4. 微积分
目录 2.4. 微积分1)导数和微分2)偏导数3)梯度4)链式法则5)小结 . 2.4. 微积分 微积分的起源: 古希腊人通过逼近法(多边形边数↑ → 面积逼近圆)发展出积分的思想。 微分ÿ…...

流程自动化引擎:让业务自己奔跑
在当今竞争激烈的商业环境中,企业面临着快速变化的市场需求、日益复杂的业务流程以及不断增长的运营成本。如何优化业务流程、提升效率并降低成本,成为企业持续发展的关键问题。 流程自动化引擎(Process Automation Engine)作为一…...

AI炼丹日志-23 - MCP 自动操作 自动进行联网检索 扩展MCP能力
点一下关注吧!!!非常感谢!!持续更新!!! Java篇: MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 大数据篇 300: Hadoop&…...

用 Python 模拟雪花飘落效果
用 Python 模拟雪花飘落效果 雪花轻轻飘落,给冬日带来一份浪漫与宁静。本文将带你用一份简单的 Python 脚本,手把手实现「雪花飘落效果」动画。文章深入浅出,零基础也能快速上手,完整代码仅需一个脚本文件即可运行。 目录 前言…...

基于定制开发开源AI智能名片S2B2C商城小程序的大零售渗透策略研究
摘要:本文聚焦“一切皆零售”理念下的大零售渗透趋势,提出以定制开发开源AI智能名片S2B2C商城小程序为核心工具的渗透策略。通过分析该小程序在需求感应、场景融合、数据驱动等方面的技术优势,结合零售渗透率提升的关键路径,揭示其…...