由简单的进度条所引发的问题

本文内容的概述:
1、进度条实现原理。
2、缓冲区的问题。
3、回车换行问题。
4、进度条的实现机制。
5、编写简单的Makefile文件。


1、进度条的实现原理:
通过增加字符来保证进度的增加。所以,一开始我们给定一个102的定长数组(下标从0到101),0号下标不使用,1到100下标表示进度,101号下标表示进度条完成时字符串的结束标志(C语言中字符串结束的标志是\0)。打印进度条的时候,我们是采用只打印一行,并且是递增的形式进行打印,所以这里就有一个缓冲区的问题。


2、缓冲区问题:
为什么需要有缓冲区?
这里说的缓冲区是标准输入标准输出的缓冲区。如果我们每次输入一个字符就去找CPU进行处理的话,这样从效率上来说,是比较低效的。所以标准的输入和输出都有一个缓冲区。主要是为了提高效率。
缓冲区的分类:
缓冲区分为全缓冲,行缓冲,无缓冲。全缓冲就是当整个缓冲区写满的时候,才将缓冲区的数据,拷贝到标准输到标准输入输出的磁盘文件。行缓冲就是,当遇到\n(换行)的时候,才将缓冲区的内容写入标准输入输出的磁盘文件。无缓冲,顾名思义。
缓冲区的刷新:
(1)整个缓冲区已被写满。
(2)遇到\n。
(3)fflush手动刷新缓冲区。
(4)当scanf需要从缓冲区中读取数据的时候,也会将缓冲区的数据刷新。
系统是如何控制缓冲区以及对缓冲区进行刷新?
这里写图片描述
在结构体中,缓冲区的基地址是不会改变的。有新的数据写入缓冲区,则会改变ptr,cnt,charbuf这些信息。当ptr == base+bufsiz-1的时候,说明缓冲区已经满了。需要对数据进行刷新。
刷新的时候,将缓冲区的内容拷贝至磁盘的输出输出文件,然后改变ptr=base,cnt = 0,charbuf = 0.这样就完成了刷新。
在上边我们提到行缓冲的时候,遇到\n(换行 )就会进行刷新。在之前学习的时候,总是以为回车换行是一样的概念。其实并不是这样。这里继续给出理解以及验证。


3、回车(\r)换行(\n)问题
回车和换行是不一样的概念。
在windows系统下:
回车:\r,表示回到当前行的行首,ASCII码值 是13。
换行:\n,表示光标进入当前行的下一行,ASCII码值是10。
windows下的VS2008进行测试:

#include<stdio.h>
#include<windows.h>
int main()
{
    printf("hello,w\n");
    printf("hello,yao\r");
    printf("hello,2017\n");
    printf("bye,2016\r");
    printf("loveC++\n");
    system("pause");
    return 0;
}

程序运行结果以及分析:
这里写图片描述
在Linux中,\n会进行回车加换行的操作;\r则不会进行回车的操作,只会当做^M(控制字符)处理。
依然使用上述代码进行测试,测试结果:
这里写图片描述
在windows下,每行的结尾是<\n><\r>;在Linux下,每行的结尾是<\n>。
Linux的文件在Windows下打开,所有的内容变为1行。
在Linux下打开windows的文件,每行的结尾会多出一个^M符号。(这里不给出测试结果)


4、进度条的实现机制
掌握了以上的知识之后,我们就来实现一个简易的进度条。
实现机制:采用定长数组进行输出进度条,每次将要输出的内容写进缓冲区之后,进行\r格式控制(光标移动到当前行的行首),然后强制刷新缓冲区,缓冲区的内容就会被拷贝到标准输入输出的磁盘文件(显示出来)。
sleep函数和usleep函数:
这里写图片描述
下边我们来给出实现的代码:
这里写图片描述


5、编写Makefile文件
代码编写完成之后,需要进行编译连接生成可执行程序。有两种方法:
第一种:
gcc main.c ProcBar.c -o ProcBar
第二种:使用Makefile文件
编译makefile文件
这里写图片描述
make:
直接输入make命令,就会生成ProcBar文件。
清理解决方案:clean命令。
进度条的实现效果:
这里写图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值