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

C语言初学者笔记【文件操作】

文章目录

  • 一、为什么使用文件?
  • 二、什么是文件?
    • 1.程序文件
    • 2. 数据文件
    • 3. 文件名
  • 三、二进制文件和文本文件
  • 四、文件的打开和关闭
    • 1. 流和标准流
    • 2. 文件指针
    • 3. 文件的打开和关闭函数
    • 4.文件打开模式:
  • 五、文件的顺序读写
  • 六、文件的随机读写
    • 1. fseek
    • 2. ftell
    • 3. rewind
  • 七、文件读取结束的判定
  • 八、文件缓冲区
  • 总结


一、为什么使用文件?

· 程序数据默认存储在内存中,程序退出后数据丢失
· 文件可实现数据的持久化保存
· 再次运行程序时可以读取之前保存的数据

二、什么是文件?

1.程序文件

· 源程序文件(.c)
· 目标文件(.obj)
· 可执行程序(.exe)

2. 数据文件

· 程序运行时读写的数据文件
· 从文件读取数据或向文件输出数据

3. 文件名

· 文件标识包含:文件路径 + 文件名主干 + 文件后缀
· 示例:c:\code\test.txt
· 文件标识通常简称为文件名

三、二进制文件和文本文件

区别:

· 二进制文件:数据直接以二进制形式存储到外存
· 文本文件:数据以ASCII码形式存储,需要转换

存储示例:

· 整数10000的存储:
· ASCII形式:5个字节(‘1’,‘0’,‘0’,‘0’,‘0’)
· 二进制形式:4个字节(int类型)

四、文件的打开和关闭

1. 流和标准流

· 流:抽象概念,想象成流淌字符的河
· 标准流(程序启动时自动打开):
· stdin:标准输入流(键盘)
· stdout:标准输出流(显示器)
· stderr:标准错误流(显示器)

2. 文件指针

· 类型:FILE*
· 每个被使用的文件在内存中有一个FILE结构体
· 通过文件指针访问文件信息区

3. 文件的打开和关闭函数

// 打开文件
FILE *fopen(const char *filename, const char *mode);// 关闭文件
int fclose(FILE *stream);

4.文件打开模式:

模式 含义 文件不存在时
“r” 只读(文本文件) 出错
“w” 只写(文本文件) 创建新文件
“a” 追加(文本文件) 创建新文件
“rb” 只读(二进制文件) 出错
“wb” 只写(二进制文件) 创建新文件
“ab” 追加(二进制文件) 创建新文件
“r+” 读写(文本文件) 出错
“w+” 读写(文本文件) 创建新文件
“a+” 读写(文本文件,追加) 创建新文件
“rb+” 读写(二进制文件) 出错
“wb+” 读写(二进制文件) 创建新文件
“ab+” 读写(二进制文件,追加) 创建新文件

五、文件的顺序读写

常用函数:

· 适用于所有输入流:fscanf, fgetc, fgets, fread
· 适用于所有输出流:fprintf, fputc, fputs, fwrite

函数对比:

· scanf/fscanf/sscanf
· printf/fprintf/sprintf

六、文件的随机读写

1. fseek

· 根据文件指针位置和偏移量定位
· 示例:

fseek(pFile, 9, SEEK_SET); // 从文件开头偏移9字节

2. ftell

· 返回文件指针相对于起始位置的偏移量
· 示例:获取文件大小

fseek(pFile, 0, SEEK_END);
long size = ftell(pFile);

3. rewind

· 让文件指针回到文件起始位置
· 示例:

rewind(pFile);

七、文件读取结束的判定

重要原则:

· 不能直接用feof判断文件是否结束
· feof用于判断结束原因是否为遇到文件尾

正确的判断方法:

· 文本文件:
· fgetc判断是否为EOF
· fgets判断返回值是否为NULL
· 二进制文件:
· fread判断返回值是否小于实际要读的个数

读取结束后判断结束原因:

if (ferror(fp))puts("I/O error when reading");
else if (feof(fp))puts("End of file reached successfully");

八、文件缓冲区

· ANSIC标准采用"缓冲文件系统"
· 内存与磁盘间数据传输通过缓冲区
· 从内存向磁盘输出:先送到缓冲区,装满后一起送到磁盘
· 从磁盘向内存输入:先读到缓冲区,再从缓冲区送到程序数据区

缓冲区操作:

· 手动刷新:fflush(pf)
· 关闭文件:fclose(pf)也会刷新缓冲区

注意事项:

· 操作文件时需要刷新缓冲区或关闭文件
· 否则可能导致读写文件问题

总结

· 文件操作是C语言中实现数据持久化的重要手段
· 理解文件类型(文本/二进制)、文件指针、文件打开模式是关键
· 掌握顺序读写和随机读写函数的使用
· 正确判断文件读取结束条件和原因
· 注意文件缓冲区的存在和操作


注意:实际编程中应始终检查文件操作函数的返回值,确保操作成功后再进行后续处理。

http://www.xdnf.cn/news/20408.html

相关文章:

  • ES6 核心特性详解:从变量声明到函数参数优化
  • Go基础(⑤Consul)
  • repo 学习教程
  • 第2课:环境搭建:基于DeepSeek API的开发环境配置
  • 【UAV】基于PX4+Ubuntu24.04.3的无人机制作的开发环境搭建
  • Linux awk 命令使用说明
  • 工业显示器在地铁电力监控与运维中的应用
  • 每天五分钟深度学习:神经网络的梯度下降和反向传播算法
  • Python实战:爬取百度热搜榜,制作动态可视化报告
  • 企业级监控方案对比:Zabbix vs Prometheus
  • (nice!!!)(LeetCode 面试经典 150 题 ) 130. 被围绕的区域(深度优先搜索dfs || 广度优先搜索bfs)
  • uni-app倒计时公共组件 封装,倒计时组件
  • 【Next】服务端接口
  • scikit-learn零基础配置(含python、anaconda)
  • 大电流场景首选:捷多邦解析厚铜 PCB 的应用优势
  • 【PCIe EP 设备入门学习专栏 -- 8.1.2 PCIe EP 通路详细介绍】
  • v0.29.1 敏感词性能优化之内部类+迭代器内部类
  • 中州养老项目:利用Redis解决权限接口响应慢的问题
  • Pandas基础(安装、导入Pandas、读取数据、查看数据)
  • 一、算法与数据结构的本质关系:灵魂、肉体与图书馆
  • 3、工厂模式
  • redis-----事务
  • SDRAM-08 数据手册解读
  • python系列之综合项目:智能个人任务管理系统
  • HTML标签之超链接
  • 《UE5_C++多人TPS完整教程》学习笔记48 ——《P49 瞄准偏移(Aim Offset)》
  • 【LeetCode热题100道笔记】二叉搜索树中第 K 小的元素
  • Flink-新增 Kafka source 引发状态丢失导致启动失败
  • 2.2 Web和Http
  • 从0死磕全栈第五天:React 使用zustand实现To-Do List项目