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语言中实现数据持久化的重要手段
· 理解文件类型(文本/二进制)、文件指针、文件打开模式是关键
· 掌握顺序读写和随机读写函数的使用
· 正确判断文件读取结束条件和原因
· 注意文件缓冲区的存在和操作
注意:实际编程中应始终检查文件操作函数的返回值,确保操作成功后再进行后续处理。