您的位置:首页 > 教育 > 锐评 > Linux第一个小程序——进度条

Linux第一个小程序——进度条

2024/10/6 16:29:46 来源:https://blog.csdn.net/weixin_73483158/article/details/139261516  浏览:    关键词:Linux第一个小程序——进度条

预备知识——缓冲区与换行

        先把重要结论放这:

  1. 数据的输入输出不会马上到达目的地,会先呆在缓冲区。
  2. 缓冲区相当于一行数据空间。
  3. 回车时,光标回到开头,相当于清空原有数据。
  4. 换行时,会直接将缓冲区数据输出。
  5. 程序结束时,会强制将缓冲区的数据输出。

        详情见我的另一篇文章:

缓冲区与回车换行-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.ogcc -o $@ $^main.o:main.cgcc -c main.cprocessbar.o:processbar.cgcc -c processbar.c.PHONY:cleanclean: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*1024void 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.ogcc -o $@ $^main.o:main.cgcc -c main.cprocessbar.o:processbar.cgcc -c processbar.c.PHONY:cleanclean:rm processbar main.o processbar.o

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com