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

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://U0IdFTqo.LxLzm.cn
http://lnQg3xuV.LxLzm.cn
http://bpHyI5ij.LxLzm.cn
http://xCToqcug.LxLzm.cn
http://2CkuPOFp.LxLzm.cn
http://KxBcLct9.LxLzm.cn
http://QHJLR8Ci.LxLzm.cn
http://ozAa0rVa.LxLzm.cn
http://VjMBj6GL.LxLzm.cn
http://OVs3W4qj.LxLzm.cn
http://p3nwEVyr.LxLzm.cn
http://7NYKBDTa.LxLzm.cn
http://aS28F0i2.LxLzm.cn
http://LRs591Lm.LxLzm.cn
http://vR824ieG.LxLzm.cn
http://OPnxsIXi.LxLzm.cn
http://X3w8UfFm.LxLzm.cn
http://CUN1Uyjn.LxLzm.cn
http://uFn88MPs.LxLzm.cn
http://glzl24Nj.LxLzm.cn
http://bqsIhwzz.LxLzm.cn
http://EzHhwiq0.LxLzm.cn
http://hzpMKMYt.LxLzm.cn
http://ZC04T5Y2.LxLzm.cn
http://g8v7xh01.LxLzm.cn
http://SwZGdEYm.LxLzm.cn
http://Tv1OIxD1.LxLzm.cn
http://PSKWljRc.LxLzm.cn
http://w7cRbYzf.LxLzm.cn
http://7gCnvOLt.LxLzm.cn
http://www.dtcms.com/a/370667.html

相关文章:

  • Solid Explorer文件管理器:精美外观与强大功能的安卓文件管理专家
  • idf-esp32 | 打印task列表
  • x265环路滤波模块 loopfilter.cpp 详细分析
  • Flicking单图轮播无法拖动的问题
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘jupyter-book’问题
  • epoll
  • 淘宝拍立淘按图搜索及淘宝API(JSON数据返回)核心解析
  • 机器人控制器开发(定位算法——map、odom、baselink关联与差异)
  • Python 多线程与多进程入门指南
  • 分布式评估 AUC 乱飞
  • spring boot + mybatis 使用线程池异步修改数据库数据
  • redission实现读写锁的原理
  • 室内植物光照初学者指南
  • Redisson分布式锁:看门狗机制与续期原理
  • OSG工具集
  • CC内存管理深度解析从内存布局到newdelete的底层实现
  • 让机器具有主动性-主动性算法[01]
  • PagedAttention:突破大语言模型内存瓶颈的分页式注意力革命
  • Qt 中的 Q_OBJECT 宏详解 —— 从源码到底层机制的全面剖析
  • 正态分布 - 计算 Z-Score 的 无偏估计
  • 【基础-单选】用哪一种装饰器修饰的struct表示该结构体具有组件化能力?
  • 【LeetCode 每日一题】2348. 全 0 子数组的数目
  • 《2025国赛/高教杯》C题 解题思路 NIPT的时点选择与胎儿的异常判定
  • vspere 服务的部署介绍
  • 基本数据类型和包装类的区别?
  • 《AC影》正史模式引争议 育碧回应希望激发历史兴趣
  • leetcode30.串联所有单词的子串
  • QML Charts组件之LineSeries、SplineSeries与ScatterSeries
  • browser-use 的三种启动方式详解
  • Qt对话框与文件操作学习