1. 数据流与缓冲区的概念
1.1数据流
- 数据流的意义
数据流是一串连续不断的集合,就像水管里的水流,在水管的一端一点一点的地供水,而在水管的另一端看到的是一股连续不断的水流。
对数据写入程序是一段、一段地向数据流管道写入数据,这些数据会按先后顺序被整合形成一个长的数据流。
对数据读取程序而言,看不到数据流在写入时的分段情况。
每次读取都可以读取**任意长度**的数据,但只能先读取前面的数据后,再读取后面的数据,不管写入时是将数据分多次写入,读取时的效果都是完全一样的。
- 数据流的特点
在Unix/Linux中,文本流和二进制流是相同的,但在Windows中,稍有差异,所以C标准库提供了这两种类型的流。
文本流是由文本行组成的序列,每一行包含0个或多个字符,并以'\n'结尾。在某些环境中, 可能需要将文本流转换为其它表示形式(例如把'\n'映射成回车符和换行符),或从其它表示形式转换为文本流。
二进制流是由未经处理的字节构成的序列,这些字节记录着内部数据, 并具有下列性质:如果在同一系统中写入二进制流,然后再读取该二进制流,则读出和写入 的内容完全相同。
- 数据流的映射
在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备都被映射成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。
文件 | 硬件设备 |
---|---|
stdin | 标准输入设备(键盘):如 scanf()、getchar() 等函数从 stdin 获取输入。 |
stdout | 标准输出设备(显示器);printf()、putchar() 等函数向 stdout 输出数据。 |
stderr | 标准错误输出设备(显示器);perror() 等函数向 stderr 输出数据。 |
stdprn | 标准打印设备(打印机) |
stdaux | 标准辅助输入输出设备(异步串行口)。 |
程序开始执行时,默认会打开 stdin、stdout和stderr三个文件,所以我们使用 scanf()、printf() 等函数时就不需要再使用 fopen() 显式打开这些文件。
- C语言数据流的映射过程
- 编译时打开一个流。系统将会把该流与一个文件或设备连接起来,如我要打开一个zyx.txt或从键盘输入一段数据,这时候会将该stdin流与该文件或键盘连接起来。其中在打开文件的时候,先将文件载入缓冲区,并返回一个指向FILE结构体类型的指针,该指针记录了所有控制该流的所有必要信息。
- 接下来对这个文件zyx.txt的所有操作,将会映射成对缓冲区的操作,如我要修改文件中的一个字,只要修改该缓冲区的一个字。
- 只有当强制刷新缓冲区、关闭文件或程序运行结束时,才将缓冲区的内容更新到文件中。
- 采用数据流的目的
采用数据流的目的就是使得输出输入独立于设备。
Input Stream不关心数据源来自何种设备(键盘,文件,网络);Output Stream不关心数据的目的是何种设备(键盘,文件,网络)。
1.2 缓冲区
- 缓冲区的意义
>缓冲区又称为缓存,它是内存空间的一部分,用来存储输入和要输出的数据,可以加速对