ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux实现:从倒计时到进度条

2026/8/10 7:31:39 拓冰建站 浏览量
Linux实现:从倒计时到进度条

文章目录

  • 1.回车与换行
  • 2.缓冲区的概念
  • 3.倒计时
  • 4.进度条(第一版无应用场景)
  • 5.进度条(第二版有应用场景)


1.回车与换行

在这里插入图片描述

2.缓冲区的概念

在这里插入图片描述
强制刷新可以使用冲刷函数fflush

#include <stdio.h>
#include <unistd.h>
int main()
{printf("I am a \nhandsome man!");fflush(stdout);sleep(3);return 0;
}

这样就可以强制刷新出来了!

3.倒计时

在这里插入图片描述

 1 #include <stdio.h>2 #include <unistd.h>3 4 int main()5 {6   int cnt=10;7   while(cnt>=0)8   {9     printf("%2d\r",cnt);10     fflush(stdout);11     cnt--;12     sleep(1);13   }                                                                         14   printf("\n");15   return 0;16 17 }

4.进度条(第一版无应用场景)

大制作一个这个样子的进度条:
在这里插入图片描述
在这里插入图片描述

#include <string.h>
#include <unistd.h>
#include <stdio.h>#define Length 101
#define style '#'const char* lable = "|/-\\";//两个\\表'\'符号,因为\n,\r有其他意思
void procbar()
{char bar[Length];memset(bar, '\0', sizeof(bar));int len = strlen(lable);int cnt = 0;while (cnt <= 100){printf("[%-100s][%d%%][%c]\r", bar,cnt,lable[cnt%len]);//100s从左向右打印(默认右对齐),-100s即为左对齐、、lable[cnt%len]防止越界fflush(stdout);bar[cnt] = style;cnt++;usleep(20000);}printf("\n");
}int main()
{	procbar();return 0;
}

5.进度条(第二版有应用场景)

我们的进度条不可能像第一版一样光一个进度条在那跑。
肯定是有相关场景的,比如要下载文件大小多少,带宽多少。。等等

源码:
在这里插入图片描述
makefile:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
processbar.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "processbar.h"
#include <string.h>
#include <Windows.h>#define Length 101
#define style '#'const char* lable = "|/-\\";//两个\\表'\'符号,因为\n,\r有其他意思
//第一版本
//void procbar()
//{
//	char bar[Length];
//	memset(bar, '\0', sizeof(bar));
//	int len = strlen(lable);
//	int cnt = 0;
//	while (cnt <= 100)
//	{
//		printf("[%-100s][%d%%][%c]\r", bar,cnt,lable[cnt%len]);//100s从左向右打印(默认右对齐),-100s即为左对齐、、lable[cnt%len]防止越界
//		fflush(stdout);
//		bar[cnt] = style;
//		cnt++;
//		Sleep(1);//这里要改
//	}
//	printf("\n");
//}//第二版本
void procbar(double total, double current)
{char bar[Length];memset(bar, '\0', sizeof(bar));int len = strlen(lable);int cnt = 0;double rate= (current * 100.0) / total;int loop_count = (int)rate;//将文件大小换算为百分比制,不乘100.0的话算下来是一个小数,取整就恒为0了while (cnt <= loop_count){bar[cnt] = style;cnt++;Sleep(1);}printf("[%-100s][%.1lf%%][%c]\r", bar, rate, lable[cnt % len]);//100s从左向右打印(默认右对齐),-100s即为左对齐、、lable[cnt%len]防止越界fflush(stdout);//printf("\n");
}

main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "processbar.h"
#include<Windows.h>
double filesize = 100 * 1024 * 1024;//第一个1024是字节,1024*1024是1M,这个大小总共是100Mvoid download()
{double filesize = 100 * 1024 * 1024 * 1.0;double current = 0.0;//累计下载的数据量double bandwidth = 1024 * 1024*1.0;//带宽printf("下载开始,当前进程为:%lf\n", current);while (current <= filesize){procbar(filesize,current);//动态打印出任意时刻的进度条//从网络中获取数据current += bandwidth;Sleep(1);}printf("\n下载完成,下载大小为:%lf\n", filesize);
}int main()
{download();/*procbar(100.0,56.9);procbar(100.0, 99.9);		//这三个地方是指定下载到百分之多少procbar(100.0, 10.1);*/return 0;
}

processbar.h

#pragma once
#include <stdio.h>void procbar(double total, double current);