马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
准备知识——缓冲区与换行
先把重要结论放这:
- 数据的输入输出不会立即到达目标地,会先呆在缓冲区。
- 缓冲区相当于一行数据空间。
- 回车时,光标回到开头,相当于清空原有数据。
- 换行时,会直接将缓冲区数据输出。
- 程序竣事时,会强制将缓冲区的数据输出。
详情见我的另一篇文章:
缓冲区与回车换行-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企服之家,中国第一个企服评测及商务社交产业平台。 |