ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Linux第一个小程序——进度条
[打印本页]
作者:
乌市泽哥
时间:
2024-6-28 14:39
标题:
Linux第一个小程序——进度条
准备知识——缓冲区与换行
先把重要结论放这:
数据的输入输出不会立即到达目标地,会先呆在缓冲区。
缓冲区相当于一行数据空间。
回车时,光标回到开头,相当于清空原有数据。
换行时,会直接将缓冲区数据输出。
程序竣事时,会强制将缓冲区的数据输出。
详情见我的另一篇文章:
缓冲区与回车换行-CSDN博客
写一个倒计时程序
#include<stdio.h>
#include<unistd.h>
int main()
{
int i = 10;
while(i)
{
printf("%-2d\r", i);
fflush(stdout);
sleep(1);
i--;
}
return 0;
}
复制代码
%-2d,保存两位数且向左对齐
编写入门版进度条
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#define MAX 101
#define LABEL '='
int main()
{
char bar[MAX];
memset(bar, '\0', sizeof(bar));
int count = 101;
while(count--)
{
bar[100 - count] = LABEL;
usleep(100000);
printf("%s\r", bar);
fflush(stdout);
}
printf("\n");
return 0;
}
复制代码
多文件编写升级版进度条
Version1
main.c
#include"processbar.h"
int main()
{
processbar();
return 0;
}
复制代码
processbar.h
#pragma once
#include<stdio.h>
#define NUM 101
#define Body '='
#define Head '>'
void processbar();
复制代码
processbar.c
#include"processbar.h"
#include<unistd.h>
#include<string.h>
const char *loading = "|/-\";
void processbar()
{
char bar[NUM];
int n = strlen(loading);
memset(bar, '\0', sizeof(bar));
int cnt = 0;
while(cnt <= 100)
{
bar[cnt++] = Body;
if(cnt < 100)
bar[cnt] = Head;
printf("[%-101s][%3d%%][%c]\r", bar, cnt - 1, loading[cnt%n]);
fflush(stdout);
usleep(100000);
}
printf("\n");
}
复制代码
makefile
processbar:main.o processbar.o
gcc -o $@ $^
main.o:main.c
gcc -c main.c
processbar.o:processbar.c
gcc -c processbar.c
.PHONY:clean
clean:
rm processbar main.o processbar.o
复制代码
Version2
main.c
#include"processbar.h"
int main()
{
processbar();
return 0;
}
复制代码
processbar.h
#pragma once
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define NUM 101
#define Body '='
#define Head '>'
#define FILESIZE 1024*1024*1024
void processbar();
复制代码
processbar.c
#include"processbar.h"
char bar[NUM];
const char *label = "|/-\";
void processbar()
{
int total = FILESIZE;
int num = 0;
srand(time(NULL)^1023);
memset(bar, '\0', sizeof(bar));
while(total)
{
usleep(100000);
int one = rand()%(1024*1024*50);
total -= one;
if(total < 0) total = 0;
double rate = ((FILESIZE - total)*1.0 / (FILESIZE)) * 100.0;
num++; num %= 4;
memset(bar, Body, sizeof(char)*((int)rate + 1));
if((int)rate < 100) bar[(int)rate] = Head;
printf("[%-101s][%6.2f%%][%c]\r", bar, rate, label[num]);
fflush(stdout);
}
printf("\n");
}
复制代码
makefile
processbar:main.o processbar.o
gcc -o $@ $^
main.o:main.c
gcc -c main.c
processbar.o:processbar.c
gcc -c processbar.c
.PHONY:clean
clean:
rm processbar main.o processbar.o
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4