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


一、为什么使用文件?

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

二、什么是文件?

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


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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值