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

C 语言文件操作(上)

一、为什么使用文件

程序运行时数据存于内存,程序退出内存回收,数据丢失; 文件可以把数据持久化存储到磁盘,下次运行程序仍可读取历史数据。

二、文件基础概念

1. 文件分类(按功能)

  1. 程序文件
    • 源文件:.c
    • 目标文件:Windows 下.obj
    • 可执行程序:Windows 下.exe
  2. 数据文件(本章核心讲解对象) 存储程序读写的数据,用来存放输入 / 输出内容,区别于键盘、显示器终端交互。

2. 文件名

完整格式:文件路径 + 文件名主干 + 文件后缀示例:c:\code\test.txt,日常简称文件名。

3. 文本文件 vs 二进制文件(按数据存储形式)

二进制文件内存中二进制数据不做任何转换直接存入外存。 例:int a=10000二进制存储仅占 4 字节。

文本文件数据全部转为 ASCII 字符再存储,数值会拆分成单个字符。 例:int a=10000ASCII 存储占 5 字节('1','0','0','0','0')。

存储规则:字符统一 ASCII 存储;数值ASCll或二进制存储。

三、流、标准流与文件指针

1. 流的概念

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。

2. 三大标准流(程序启动自动打开,无需手动 fopen)

类型均为FILE*(文件指针)

  1. stdin:标准输入流 → 键盘,scanf读取
  2. stdout:标准输出流 → 显示器,printf输出
  3. stderr:标准错误流 → 显示器,打印错误信息

3. 文件指针 FILE*

打开文件时,系统在内存创建FILE 结构体(文件信息区),存储文件名、读写位置、文件状态等;不同编译器结构体细节略有差异。

FILE* pf:指针指向该 FILE 结构体,通过指针间接操作对应文件。

四、文件打开与关闭

1. 核心函数

  • 打开:FILE* fopen(const char* filename, const char* mode);
  • 关闭:int fclose(FILE* stream);

规范:打开文件后必须判断指针是否为 NULL(打开失败);使用完毕必须关闭文件,释放资源 + 刷新缓冲区。

2. 打开模式大全

模式类型功能文件不存在时
r文本只读,读取已有文件报错返回 NULL
w文本只写,清空原有内容写入创建新文件
a文本追加,在文件末尾写创建新文件
rb二进制只读二进制文件报错
wb二进制只写二进制文件创建新文件
ab二进制二进制末尾追加创建新文件
r+文本可读可写(原有文件)报错
w+文本可读可写(新建清空)创建
a+文本可读,末尾追加写创建
rb+二进制二进制读写(原有)报错
wb+二进制二进制读写(新建清空)创建
ab+二进制二进制可读,末尾追加创建

3. 基础示例

如图所示因为要打开的文件就在目前代码所在的路径上面,所以可以只写文件名

int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } else { printf("打开文件成功"); } return 0; }

但如果要打开别的路径上面的文件,就得写全,比如我们想要打开桌面上的text.txt文件

int main() { //绝对路径 FILE* pf = fopen("C:\\Users\\Edbsee\\Desktop\\test.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } else { printf("打开文件成功"); } return 0; }

有一种简便写法,如果想要打开的文件不在目前所在代码的路径上,而是在上一级路径,我们可以用.表示,.表示当前路径,..表示上一级路径,如下代码,就是在当前文件所在路径的上一级路径上打开test.txt文件

int main() { FILE* pf = fopen("./../test.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } else { printf("打开文件成功"); } return 0; }

最后我们要关闭文件,再让指针指向NULL,避免野指针

int main() { FILE* pf = fopen("./../test.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } else { printf("打开文件成功"); } fclose(pf); pf = NULL; return 0; }
http://www.jsqmd.com/news/1312557/

相关文章:

  • 基于EUI-NEO-DX11框架构建高性能C++桌面GUI应用实战指南
  • WAIC 2026:机器人开始接走人的活
  • PMP费用明细怎么核对和报名怎么咨询? - 众智商学院官方
  • 2026年安庆AIGC应用工程师怎么报名?中山优才教育报考指南 - 人工智能报名机构推荐
  • 多模态大模型夜盲症揭秘:NightSight基准实测与低光视觉鲁棒性提升
  • 2026 年 7 月新发布:北塔有实力的挖掘机包月平台推荐几家,同样是挖土方,你按天算花了三万,却不知这样包月能省出半台车钱?-汇海工程机械 - 企业推荐管【认证】
  • 2026年石家庄五粮液回收市场观察:正规渠道厂家推荐与选择指南 - 优质品牌商家
  • NBTExplorer:免费开源的Minecraft数据编辑终极指南 [特殊字符]
  • Android短信链接唤起App全攻略:从Deep Link到App Link的实战避坑
  • 医生与AI评估LLM临床能力存在系统性分歧:400+医生7专科多中心研究揭示评估标准不可互换
  • LSTM时间序列预测实战:从原理到PyTorch实现
  • Windows Subsystem for Android完整指南:在Windows 11上轻松运行安卓应用
  • 深入理解计算机系统:程序员必备的系统思维与底层知识框架
  • 2026年电子车间净化工程怎么选?专业视角解析关键考量因素 - 优质品牌商家
  • 2026浙江音乐艺考择校白皮书:避坑指南与五大机构横评 - 品牌报告
  • 归并排序与快速排序深度对比:从原理到实战选型指南
  • Unity性能优化实战:八叉树实现视锥体剔除提升帧率
  • 如何在Windows上免费实现专业级音频均衡器调校:Equalizer APO完全指南
  • GHO镜像转VMDK虚拟机:物理机系统备份迁移至VMware全攻略
  • 2026年乐山苏稽临江鳝丝与米花糖选购指南:哪家门店更可靠? - 优质品牌商家
  • 2026年广州电商客服外包厂家推荐:口碑与实力深度评测 - 优质品牌商家
  • 研究生学术效率工具全攻略:从文献管理到论文降重
  • 微信内置浏览器UA解析:构建设备指纹库与前端兼容性实战指南
  • 2026年上海回收15年茅台酒哪家有名?这份口碑甄选指南帮你择优 - geo交流
  • 上班族空余时间做抖音小店,一件代发模式值不值得长期投入? - 抖掌柜
  • 019、ASFF自适应空间特征融合与CARAFE内容感知上采样在Neck中的集成——即插即用涨点方案
  • 用MicroBlocks图形化编程玩转XIAO nRF52840:从环境监测到蓝牙实战
  • 2026 合肥装修公司优选:适配本地气候的防潮家装团队参考 - 装修大知识
  • SM4加密中PKCS5与PKCS7填充算法详解及实战应用
  • 2026年广州优质微孔聚脲隔声保温材料公司甄选指南 - geo交流