目录
文章目录
知识点1 文件的概述
1 文件的定义
2 Linux系统中的文件定义
3 Linux系统中文件的访问
3.1 文件缓冲区概述
3.2 文件缓冲区具体形式
4 磁盘文件分类
4.1 磁盘文件分类说明
4.2 文本文件和二进制文件的区别
知识点2 标准IO库
1 FILE文件指针
1.1 FILE指针的概述
1.2 FILE结构体数据类型的定义
1.3 FILE指针的管理
1.4 FILE指针的分配
2 文件的IO操作
2.1 打开文件流-fopen
2.2 读写文件流
2.2.1 按字节读写数据
2.2.2 按行读写数据
2.2.3 读写一段数据
2.3 关闭文件流
2.4 文件流定位
2.5 freopen重定向文件流
2.6 文件流数据格式输入和输出
3 练习
所谓的文件,指的是程序、文档、图片、音视频等数据的有序集合,对于文件是数据在磁盘中存储的有序集合,称为文件。
在Linux操作系统一切皆文件,主要包含磁盘文件和设备文件
1. 设备文件
在Linux嵌入式系统中,所有的硬件设备在驱动加载成功的情况下,需要在根文件系统中创建设备节点,提供给应用程序访问,以实现应用程序对硬件设备访问,此时在根文件系统中的设备节点就称为设备文件。
在Linux设备文件主要包含字符设备文件和块设备文件
1) 字符设备文件:
字符设备文件的访问以字节流的方式进行访问,绝大多的设备文件都为字符设备文件;
2) 块设备文件:
块设备文件的访问,是以存储块为单位进行访问,一般表示存储设备文件。
2. 磁盘文件
对于磁盘文件,是存储在外部存储介质中的文件,一般实现有序数据的有效存储。
在Linux系统中的磁盘文件,主要包含普通的文件(程序、文本、图片、音视频等)、也可以是有多个文件构成目录。对于磁盘文件可以通过相关API接口调入到内存中实现访问。
由标准C库所开辟的存储空间,用于数据的临时存储,根据数据的访问的方向可以将文件缓冲分为读文件缓冲区和写文件缓冲区;
1) 读文件缓冲区:
用于数据从磁盘中输入到内存中,程序实现文件的读访问过程
磁盘 --> 读文件缓冲区 --> 内存;
2) 写文件缓冲区:
用于数据从内存中输出到磁盘中,程序实现文件的写访问过程。
内存 --> 写文件缓冲区 --> 磁盘;
在Linux操作系统中,对于磁盘文件的访问过程中,具体实现形式有三种:
1. 行缓冲
所谓的行缓冲,指的是在IO访问过程中,数据在遇到行缓冲标识符'\n',自动刷新缓冲区。
#include
int main()
{
#if 1
/* 写入的数据中包含了行标识符('\n'),此时采用的行缓冲形式,所有在遇到行缓冲标识符的时候,自动刷新标识符前面的所有数据*/
printf("hello\n");
#else
printf("hello");
#endif
while(1);
}
2. 全缓冲
标准C库为IO操作开辟固定大小的存储空间作为缓冲区,所谓的全缓冲,指的是在IO访问的过程中,只有在满足特定条件情况下才会自动刷新缓冲区。一般默认为缓冲区为满的时候刷新。
1) 缓冲区不为满,不自动刷新缓冲区
#include
int main()
{
#if 0
printf("hello\n");
#else
/* 写入缓冲区的数据字节数 小于缓冲区的大小,所以缓冲区不为满,不满足刷新条件,也就不会刷新缓冲区的数据到标准输出流中,所以不会显示数据 */
printf("hello");
#endif
while(1);
}
/* 程序运行的结果:程序一直运行,但是没有任何数据的输出 */
2) 缓冲区为满,自动刷新缓冲区
#include
#include
int main()
{
int i = 0;
#if 0
printf("hello\n");
#else
printf("hello");
#endif
while(1) {
printf("%3d", i++); /* 循环写入3字节的数据 */
usleep(5000);
}
}
/* 程序的运行结果:程序一直运行,每隔一端数据,输出一段数据内容;原因是程序在循环的将数据写入缓冲区中,每隔一段时间缓冲区写满,此时自动刷新缓冲区 */
3) 人为刷新缓冲区
在标准C库中提供自动刷新缓冲区的API接口
#include
int fflush(FILE *stream);
功能:自动刷新stream指定文件流的缓冲区数据。
4) 在程序退出的时候,自动刷新缓冲区中的数据
#include
int main()
{
printf("hello"); /* 在整个程序运行结束的时候,自动刷新缓冲区的数据,及时全缓冲区不满也会刷新 */
}
3 不带缓冲区
不带缓冲也称为无缓冲形式,直接实现内存和磁盘数据的直接交互,此时读数据和写数据都是以字节为单位进行,频繁进行模式的切换,效率会降低。在错误数据输出情况下一般会使用无缓冲形式。
根据磁盘文件的存储编码,可以将文件分为二进制文件和文本文件
1. 文本文件
所谓的文本文件,指的是数据的存储编码为文本形式存储,具体的编码形式可以ASCII编码、UNICODE编码等形式。
以ASCII编码为例说明:
存储数据:567ABC
所以数据的存储编码,具体表示数据以字符采用ASCII存储编码形式存储,分别对应字符:'5'、'6'、'7'、'A'、'B'、'C'
'5':ASCII存储编码53 (0011 0101)
'6':ASCII存储编码54 (0011 0110)
'7':ASCII存储编码53 (0011 0111)
'A': ASCII存储编码 01000001
'B':ASCII存储编码 01000010
'C':ASCII存储编码 01000011
整个数据的存储编码:0011 0101 0011 0110 0011 0111 0100 0001 0100 0010 0100 0011
2. 二进制文件
所谓的二进制文件,指的是数据的存储编码有数据的内容决定,如果数值数据的存储编码使用整型数据的二进制编码存储,其它数据存储编码使用的文本编码形式存储。
存储数据:567ABC
567以二级制编码形式存储,其存储编码为:0010 0011 0111
ABC以其它编码形式存储,以ASCII编码为例说明
'A': ASCII存储编码 01000001
'B':ASCII存储编码 01000010
'C':ASCII存储编码 01000011
&n