首页 > 运维 > linux运维 > 正文

通过小程序进度条了解Linux下的多文件操作

蓮花仙者
发布: 2025-06-21 12:30:02
原创
713人浏览过

在网络中,进度条随处可见,无论是下载还是上传,进度条都帮助我们判断当前的进展情况。然而,今天我们将讨论的进度条仅具备外观。首先,让我们了解一下回车的概念。

1.1 回车的概念

在计算机出现之前,有一种名为电传打字机(Teletype Model 33)的机械打字机,每秒钟可以打10个字符。但在换行时需要0.2秒,这段时间内如果有新字符传输过来,字符可能会丢失。为了解决这个问题,研发人员在每行结尾添加了两个结束字符:一个是“回车”,指示打字机将打印头定位到左边界而不卷动滚筒;另一个是“换行”,指示打字机卷动滚筒而不改变水平位置。随着计算机的发明,这两个概念被引入计算机中。由于存储器昂贵,一些科学家认为在每行结尾添加两个字符太浪费,因此出现了分歧。

回车 的本义是将光标重新回到本行的开头,英文为return,控制字符为CR(Carriage Return)。换行 的本义是将光标移到下一行(不一定是下一行的行首),英文为newline,控制字符为LF(Line Feed)。

符号 ASCII码 意义
10 换行NL
13 回车CR

在进度条中,我们需要使用 来将光标回到一行的开头。

1.2 缓冲区的概念

缓冲区是内存的一部分,用于暂存输入或输出的数据。根据对应的是输入设备还是输出设备,缓冲区分为输入缓冲区和输出缓冲区。当我们使用printf函数时,内容先进入缓冲区,然后再从缓冲区打印到屏幕。由于代码中存在sleep,缓冲区的内容不会立即打印到屏幕,这会影响进度条的运行。因此,需要使用fflush强制将缓冲区的内容输出。输出缓冲区的流是stdout,将stdout作为fflush函数的参数即可输出内容。大家可以尝试以下代码:

通过小程序进度条了解Linux下的多文件操作

#include <stdio.h>
#include <unistd.h>
int main(){
    printf("hello makefile");
    sleep(3);
    return 0;
}
登录后复制

1.3 makefile的准备

为了充分利用Linux下的makefile,本次进度条将分为以下三个文件编写:

progressbar.c  progressbar.h  test.c
登录后复制

在编写之前,我们先配置makefile的内容:

progressbar:test.o progressbar.o
    gcc -o progressbar test.o progressbar.o
test.o:test.c
    gcc -c test.c
progressbar.o:progressbar.c
    gcc -c progressbar.c
.PHONY:clean
clean:
    rm -f progressbar progressbar.o test.o
登录后复制

配置完成后,在progressbar.h中编写本次程序可能用到的头文件:

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
typedef void(*callback_c)(double rate); //函数指针
void progress();//进度条1.0
void 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;//假设文件大小为1GB
void 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下的多文件操作的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号