在网络中,进度条随处可见,无论是下载还是上传,进度条都帮助我们判断当前的进展情况。然而,今天我们将讨论的进度条仅具备外观。首先,让我们了解一下回车的概念。
1.1 回车的概念
在计算机出现之前,有一种名为电传打字机(Teletype Model 33)的机械打字机,每秒钟可以打10个字符。但在换行时需要0.2秒,这段时间内如果有新字符传输过来,字符可能会丢失。为了解决这个问题,研发人员在每行结尾添加了两个结束字符:一个是“回车”,指示打字机将打印头定位到左边界而不卷动滚筒;另一个是“换行”,指示打字机卷动滚筒而不改变水平位置。随着计算机的发明,这两个概念被引入计算机中。由于存储器昂贵,一些科学家认为在每行结尾添加两个字符太浪费,因此出现了分歧。
回车 的本义是将光标重新回到本行的开头,英文为return,控制字符为CR(Carriage Return)。换行 的本义是将光标移到下一行(不一定是下一行的行首),英文为newline,控制字符为LF(Line Feed)。
10换行NL13回车CR
在进度条中,我们需要使用来将光标回到一行的开头。
1.2 缓冲区的概念
缓冲区是内存的一部分,用于暂存输入或输出的数据。根据对应的是输入设备还是输出设备,缓冲区分为输入缓冲区和输出缓冲区。当我们使用printf函数时,内容先进入缓冲区,然后再从缓冲区打印到屏幕。由于代码中存在sleep,缓冲区的内容不会立即打印到屏幕,这会影响进度条的运行。因此,需要使用fflush强制将缓冲区的内容输出。输出缓冲区的流是stdout,将stdout作为fflush函数的参数即可输出内容。大家可以尝试以下代码:

#include #include int main(){ printf("hello makefile"); sleep(3); return 0;}
1.3 makefile的准备
为了充分利用Linux下的makefile,本次进度条将分为以下三个文件编写:
文小言
百度旗下新搜索智能助手,有问题,问小言。
57 查看详情
progressbar.c progressbar.h test.c
在编写之前,我们先配置makefile的内容:
progressbar:test.o progressbar.o gcc -o progressbar test.o progressbar.otest.o:test.c gcc -c test.cprogressbar.o:progressbar.c gcc -c progressbar.c.PHONY:cleanclean: rm -f progressbar progressbar.o test.o
配置完成后,在progressbar.h中编写本次程序可能用到的头文件:
#pragma once#include #include #include #include #include typedef void(*callback_c)(double rate); //函数指针void progress();//进度条1.0void progress2(double rate);//进度条2.0
1.4 进度条1.0
旋转光标的存在是为了模拟现实中进度条卡住的情况,判断进度条是否还在运行。
char load[4] = {'|','/','-',''};//旋转光标void progress(){ char str[101]; memset(str,0,sizeof(str)); int i = 0; for(i = 0;i<100;i++){ str[i] = '#'; printf("[%-100s][%d%%][%c]",str,i+1,load[i%4]); fflush(stdout); usleep(50000); } printf("");}
这个进度条仅具备外观,没有实际意义。
1.5 进度条2.0
模拟下载过程,通过当前下载的比例来判断进度。
char p_str[101];void progress2(double rate){ int cnt = (int)rate; printf("[%-100s][%.1lf%%][%c]",p_str,rate,load[cnt%4]); fflush(stdout); p_str[(int)rate] = '#';}#include "progressbar.h"int filesize = 1024*1024*1024;//假设文件大小为1GBvoid download(callback_c cb){ //模拟下载过程 srand((unsigned int)time(NULL));//随机下载文件的大小 int total = filesize;//已下载文件的大小 while(total>0) { usleep(20000); int load = rand()%(1024*1024*10);//下载速度0~1MB*10 total-=load; if(total<0) total = 0; double rate = (double)(filesize-total)/filesize*100; cb(rate); } printf("");}
以上就是通过小程序进度条了解Linux下的多文件操作的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/485783.html
微信扫一扫
支付宝扫一扫