C语言实现文本进度条
C语言实现文本进度条
int main()
{char pb[51] = {0};memset(pb, '-', sizeof(pb) - 1); //初始化50格puts("==下载文件==");for (int i = 0; i < strlen(pb); i++) {char tmp[51];strcpy(tmp, pb);memset(tmp, '*', i);printf("[%d%%][%s]\r", i * 2, tmp); // 打印Sleep(200);}memset(pb, '*', sizeof(pb) - 1);printf("[%d%%][%s]\r", 100, pb); // 结束printf("\n文件下载完成\n");system("pause");
}
优化一下:
#include <stdio.h>
#include <string.h>#ifdef _WIN32#include <windows.h>#define SLEEP_MS(x) Sleep(x)
#else#include <unistd.h>#define SLEEP_MS(x) usleep((x) * 1000)
#endif#define BAR_LENGTH 50 // 进度条长度void show_progress(int percent)
{char bar[BAR_LENGTH + 1];int filled = percent * BAR_LENGTH / 100;for (int i = 0; i < BAR_LENGTH; ++i)bar[i] = (i < filled) ? '*' : '-';bar[BAR_LENGTH] = '\0';printf("\r[%3d%%][%s]", percent, bar);fflush(stdout);
}int main(void)
{puts("== 下载文件 ==");for (int i = 0; i <= 100; i += 2) {show_progress(i);SLEEP_MS(100); // 控制刷新速度}printf("\n文件下载完成!\n");printf("按 Enter 键退出...");getchar();return 0;
}
加个 下载速度,模拟文件下载
#include <stdio.h>
#include <stdlib.h>
#include <time.h>#ifdef _WIN32#include <windows.h>#define SLEEP_MS(x) Sleep(x)
#else#include <unistd.h>#define SLEEP_MS(x) usleep((x) * 1000)
#endif#define BAR_LENGTH 50
#define TOTAL_MB 100.0// 打印一帧进度条
void show_progress(double downloaded, double total, double speed)
{int percent = (int)((downloaded / total) * 100.0);int filled = (int)((double)BAR_LENGTH * percent / 100.0);char bar[BAR_LENGTH + 1];for (int i = 0; i < BAR_LENGTH; ++i)bar[i] = (i < filled) ? '#' : '-';bar[BAR_LENGTH] = '\0';const double eta = (total - downloaded) / (speed > 0 ? speed : 1e-9); // 预计剩余时间printf("\r[%3d%%][%s] %.1f / %.1f MB | %.2f MB/s | ETA: %5.1fs",percent, bar, downloaded, total, speed, eta);fflush(stdout);
}int main(void)
{srand((unsigned int)time(NULL));double downloaded = 0.0;double total = TOTAL_MB;double avgSpeed = 0.0;clock_t start = clock();puts("== 模拟文件下载 ==");while (downloaded < total) {// 模拟当前速度波动(范围约 0.8~1.6 MB/s)double speed = 0.8 + ((rand() % 80) / 100.0);// 模拟下载进度downloaded += speed * 0.2; // 每次循环约 0.2 秒if (downloaded > total) downloaded = total;show_progress(downloaded, total, speed);SLEEP_MS(200);}double elapsed = (double)(clock() - start) / CLOCKS_PER_SEC;avgSpeed = total / elapsed;printf("\n下载完成!总耗时:%.2f 秒,平均速度:%.2f MB/s\n", elapsed, avgSpeed);printf("按 Enter 键退出...");getchar();return 0;
}