本文主要概述的问题:
一、进度条的实现原理
二、缓冲区的问题
三、回车和换行的问题
四、进度条的实现
五、Makefile文件的编写
我们要实现一个简单的进度条,完成后如下图所示:
那么这个建议的进度条的实现原理是什么呢?
用一个102个元素的字符数组来保存每个时间点进度条的状态,(这个代码中具体表现为多少个‘=’),每次打印用%s方式打印这个数组,然后每次都将鼠标移动到当前行的行首,再给该数组再多添加一个‘=’,光标再到行首打印该数组,在视觉效果上,就好像看到进度条在不停的向后走。
缓冲区的问题?
1.什么是缓冲区?
缓冲区又称为缓存,它是内存空间的一部分,也就是说,在内存空间中预留了一部分存储空间,用来缓冲输入或输出的数据,这部分空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备分为输入缓冲区和输出缓冲区。
2.为什么要引入缓冲区呢?
比如我们从磁盘读取数据,我们先把读取的数据放到缓冲区中,计算机再去缓冲区取数据,等缓冲区的数据取完了,再去磁盘中读取数据。这样就可以减少磁盘的读取次数。再加上计算机对缓冲区的操作速度大大快于计算机对磁盘的操作速度。所以,应用缓冲区可以大大提高计算机的运行速度。
再举一个例子,打印机大家都知道吧,打印机的打印速度相对很慢,这时,计算机将要打印的东西打印机对应的输出缓冲区中。打印机再从输出缓冲区中慢慢读取打印。这时,我们的cpu就可以去处理别的事情了。
所以呢,总结来说,缓冲区就是一块内存空间,用于输入输出设备和CPU之间。能协调低速的输入输出设备和高速的CPU之间的工作。能避免低效的输入输出长时间的占用CPU,将CPU解放出来,提高它的运行速率。
3.缓冲区的类型
缓冲区分为三种:全缓冲、行缓冲、不带缓冲
全缓冲:当填满标准I/O缓存后才进行实际I/O操作。全缓冲的代表是对磁盘文件的读写。
行缓冲:当遇到换行符时,执行实际的I/O操作。这时,我们输入的字符先放在缓冲区,等按下回车键才进行实际的I/O操作。行缓冲的代表是键盘输入文件。
不带缓冲:也就是不进行缓冲,标准出错情况stderr是典型代表。这样就可以把出错信息尽快显示出来。
4.缓冲区的刷新
下列情况会引发缓冲区的刷新:
缓冲区满、执行fflush语句、执行endl或换行语句、关闭文件。
5.那么系统如何控制对缓冲区的刷新呢?
在结构体中,缓冲区基地址不会发生改变,当有新的数据写入缓冲区时,改变结构体中_cnt,_charbuf,_bufsize等内容的大小。当_prt == _base + _bufsize-1时,表示缓冲区已满,需要对缓冲区进行刷新。刷新时,将缓冲区的内容拷贝到磁盘输出设备,再将_ptr,_bufsize,_cnt等数据置空。
回车和换行的问题?
\n: UNIX 系统行末结束符
\n\r: window 系统行末结束符
\r: MAC OS 系统行末结束符
/*======================================*/
进度条的实现
Makefile文件的编写