一、输入输出缓冲机制
1、概述
缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间, 这些存储空间用来缓冲输入 或者输出的数据,这部分预留的空间叫做缓冲区。缓冲区根据其对应的是 输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
2、为什么要有缓冲区?
- 减少IO设备的操作;
- 提高计算机的运行速度。
比如:我们从磁盘里读取信息,先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓 冲区的数据取完后再去磁盘中读取,这样就减少磁盘的读写次数,再加上计算机对缓冲区的操作大大 快于磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。
3、缓冲区的类型
- 全缓冲:当填满缓冲区之后,才会进行实际IO操作。 比如 对磁盘文件的读写。 ---window 全缓冲大小 4096字节 linux 全缓冲大小 1024字节;
- 行缓冲:当在输入和输出中遇到换行符时,执行真正的IO操作,也就是冲刷缓冲区的数据。比如键盘 输入数据;
- 不带缓冲:也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示 出来。
4、引发缓冲区的刷新
-
遇到换行符\n;
-
缓冲区满(溢出);
-
执行fflush(stdout),手动刷新缓冲区
5、原理实现
说明:
- 录入:输入输出操作的内部采用的缓冲机制,也就是当我们用 scanf() 输入数据时,并不是直接将键盘 录入的数据存储到内存变量中,而是系统会先去输入缓冲区查看是否有符合类型的数据,如果存在将 直接输入缓冲区中的数据到内存变量,此时就不用键盘录入,否则猜需要键盘录入复合类型的数据;
- 输出:相同道理,当我们使用 printf() 输出数据时,也并不是直接将内存变量存储的数据输出到输出设 备,而是先存储到输出缓冲区,当输出缓冲区被充满,或输出缓冲区中出现换行符,或者执行 fflush() ,才会将输出缓冲区的数据输出到标准输出设备。(打印机也是,我们测试用的是控制台显示 终端)
6、预编译
在A函数需要调用B函数时,B函数必须先完成编译或预编译(得到的目标文件后缀为.obj)(预编译命令为#include)
7、printf函数
语法:printf("格式控制",输出列表);
函数原型 int printf(const char * format, ...); 变参 函数
函数作用 将指定格式的数据 输出 到 屏幕终端上(输出设备)
函数参数 format----》指定格式
...---->参数不固定
指定格式---》也就是将数据 以什么样的方式 打印到屏幕上
\n :实现了一个行缓冲;
\0 :相当于空格;
8、字符格式
格式:
%d --> 整型(int)数据,%c --> 字符型(char)数据,%s --> 字符串(字符序列)型数据;
%f --> 单精度浮点型(float)数据(默认输出6位小数),%lf --> 双精度浮点型(double)数据,%e --> 指数型数据(以指数形式输出1个实数,小数点前仅一位非0数字,并输出6位小数);
%hd 短整型 short int ,%hhd 字符型的ascii码 char 数据对应的ascii码 的值,%x 十六进制, %#x 十六进制 并且 十六进制 的前缀 0x也会打印出来, #o 八进制 %#o 八进制 并且 八进制的前 缀0打印出来,%p 打印内存的地址
注意:程序开发中最小的就是字符型数据,字符数据只占一个字节,只能存放0~255范围内的整数。
9、scanf函数
语法:scanf("格式控制",输出列表);
举例:scanf("%d",&a);
10、转型函数
- round(num) --> 四舍五入;
- ceil(num) --> 向上取整;
- floor(num) --> 向下取整。
二、顺序结构
程序中所有语句都是按自上而下的顺序执行的,不发生跳转。