这一篇 我带大家复习一下,C语言中的文件 那一部分
大家注意 这里的图并非原创 是当时我老师的图片
本片作用主要是 后续会有文件相关操作,这篇帮大家复习C语言文件中的内容 有助于大家后面的理解。
文章中代码大多是图片格式,是因为这是我当时学的时候记得笔记,当时为了方便阅读,都以截图的方式记录,找不到源码的,我截取了老师当时的源码,并不是没有理解的搬运过程,谢谢理解!!希望对你有所帮助
知识点1【文件的概述】
1、文件的分类(存储介质)
磁盘文件:文件的数据存在磁盘上(音视频,图片文件,文档文件)
设备文件:通过系统将外部设备具体成文件
2、文件分类(存储方式)
任何磁盘文件 在物理上的都是二进制存储(计算机只能识别01)
逻辑上:硬盘文件分为二进制文件、文本文件
文本文件:基于字符编码的文件
二进制文件:基于值编码的文件
文本文件:
基于字符编码,常见编码ASCII,Unicode等
一般可以用文本编辑器直接打开
例如:数 5678 的以 ASCII 存储形式为:
ASCII 码:00110101 00110110 00110111 00111000
歌词文件(lrc):文本文件
二进制文件:
基于值编码,把内存中的数据原样输出到磁盘上
一般需要自己判断或使用特定软件分析数据格式
例如:数 5678 的存储形式为: 二进制码:0001 0110 0010 1110
文本文件和二进制文件的区别
文本文件
优点:
一个字节一个意思,便于查看 :可以直接使用char *p 指向首元素位置,%c打印
缺点:
空间大:一个码一个字节
效率低:将内存数据 进行ASCII码转换后,再存储到磁盘
二进制文件
二进制文件
优点:
空间小:原样存储(内存怎么写,硬盘怎么存),按照数据大小分配空间
效率高:不需要来回转换
缺点:
数据不定长,不方便查看
还有以下区别
注意:
写代码 是操作内存;
也可以直接编辑硬盘中的文件
当要用文件区分是哪个系统时:
现在各系统的磁盘文件的分别输入换行操作,在内存rb(二进制文件读取)打开文件,字符查找\r即可
利用知识点
在windows下换行是\r\n,Linux下是\n
文本文件 有一个转换的过程
二进制文件 数据原样存储与提取
知识点2【文件缓冲区】
缓冲区的目的
1、文件缓冲区的刷新方式
1、行刷新(遇到换行符 刷新)
2、满刷新(缓冲区数据放满 刷新)
这个的现象时我们可以每隔一段时间就会看到 终端上刷新数据
3、强制刷新(使用ffulsh函数 刷新)
4、结束刷新 (关闭文件的时候 将缓冲区的数据 全部刷新)
2、模拟时钟
\r 回到行首
知识点3【文件指针】
文件的指针类型 FILE *
用户定义一个指针变量
指针变量指明文件信息的起始地址 通过库函数去操作文件即可
此时的文件指针指向的地址并不是文件的真实地址,真实地址在磁盘中,这时指向的是用fopen后,产生的文件信息的首地址
库函数借助流指针操作磁盘文件
还有 fflush 中 使用的fflush(stdout) 强制刷新到当前输出终端(屏幕)
使用fgets时 使用fgets(buf,sizeof(buf),stdin)
知识点4【文件的API】
文件的操作步骤 打开 读写 关闭
1、打开文件fopen
返回值:
成功:成功打开的文件的地址
失败:NULL
path
是 文件的路径,包含文件名
指针类型可以做字符串的首地址 而路径保存在字符串中
如
char* p= “/home/work/c/day07/a.txt”;
/home/work/c/day07/a.txt 为文件的路径
fopen(p,mode)
mode为打开文件的方式 以读 写 可读可写 追加的方式打开
文件的打开方式mode:
r:只读
w:只写
a:追加方式打开
+:可读可写的方式打开
t:以文本文件方式打开(默认省略 即r默认打开文本文件)
b:以二进制文件方式打开(必须显式说明 读的时候必须是rb)
模式间可以组合
文件信息的空间在fopen调用后自动生成,无需用户创建,只需要用文件指针变量取接地址即可
2、关闭文件fclose
两个动作
1、刷新缓冲区,把缓冲区剩下的数据刷新到文件中
2、每个文件都申请了一个堆区空间,即调用fopen时,生成的FILE* fp 指向的区域(文件信息),将其释放
以上两个动作在库函数fclose 中进行
若上式没有return;
会出现段错误,因为若无return; 函数会继续执行到fclose 会访问fp的地址(NULL),出现段错误
3、一次读写一个字符
fputc fgetc
fputc(写操作)
EOF(end of file)是stdio.h中的一个宏定义,值为-1
注意:EOF只在文本文件中有效,文本文件中存的是字符(0~128),可用-1表示文件结束;然而二进制文件中存的是数值,数据原样输出,-1被当作数值处理无特殊含义
案例
fgetc(读操作)
案例
补充
fgets 内部流指针控制,读完一个自动都下一个,不用手动++
注:文件内部是没有EOF的,是系统判断指针已经指向文件末尾,系统会给一个EOF
流 的概念:在编程中都是以字节为单位出的
EOF 打印出来
我们从磁盘中打开文件 会发现是乱码
4、一次读写一个字符串
fputs fgets
fputs(写操作)
返回值:该函数返回一个非负值,如果发生错误则返回 EOF(-1)
把字符串写进文件时,‘\0’并不算文件大小,因为文件的空间大,初始化为0('\0' = 0),可见'\0'在文件中并没有特殊含义,并不能算一个字节
fgets(读操作)
与到换行符或者文件末尾结束读取
一次只能读取个字节
或者在读取 size-1 个字节停止(size-1:最后一个字节存放'\0'结束字符串)
会获取回车与空格
需要将buf[strlen[buf] - 1] = 0;
案例
实现 将一个文件 中的内容转移到另一个文件
5、一次读写n块字符串
fwrite fread
fwrite(写操作)
将内存数据原样写入 硬盘文件中
返回值是实际写入的块数即nmemb
不做转换不方便阅读
案例
fread(读操作)
将磁盘数据 原样输入到 内存
返回值:实际读到的块数,若每块100,nmenb为5,文件中有250给字节,则返回值为2
案例
使用:大文件拷贝,只要不需要在终端上查看就可以用write
优点:快
缺点:不方便查看
6、格式化读写
有一个转换的过程 方便查看
fprintf fscanf
慢 但是阅读性高
fprintf (写操作)
想一下sprintf
是将数据先转化为字符后,存入数组中,而fprintf是先转化字符后存入文件中
可知过程 内存数据变为数组,在存入文件
案例
fscanf (读操作)
知识点5 随机读写
文件默认是顺序读写:读写才能移动流指针,用户不能修改
随机读写:用户可以更改文件流指针的位置(使用函数实现)
1、引入案例
如果没有红色框内的部分,直接读取,是得不到内容的,因为流指针的位置没有在起始位置
2、随机读写的API
fseek rewind ftell
1、rewind 复位文件流指针
2、ftell 返回文件流指针 距离文件首部的字节数
再次强调:‘\0’在文件中无特殊含义,不算文件大小
3、fseek 文件流指针定位
参数3
参数2
案例(重点)
一次性读取文件数据
回顾
windows下即在VS code 中编辑文本时输入回车,大小为2个字节
当在linux下vim编辑文本,输入回车,大小为1个字节
结束
代码需要手敲,才能更好的理解。希望今天的内容对你能够有所帮助,如果你喜欢我的分享,请点赞收藏加关注,谢谢大家!!