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

        先把重要结论放这:

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

        详情见我的另一篇文章:

缓冲区与回车换行-CSDN博客

写一个倒计时程序

#include
#include

int main()
{
  int i = 10;
  while(i)
  {
    printf("%-2d\r", i);
    fflush(stdout);
    sleep(1);
    i--;
  }
  return 0;
}

 %-2d,保留两位数且向左对齐

编写入门版进度条

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

#include
#include
#include

#define MAX 101
#define LABEL '='

int main()
{
  char bar[MAX];
  memset(bar, '
#include
#include
#include
#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("
");
return 0;
}
', sizeof(bar)); int count = 101; while(count--) { bar[100 - count] = LABEL; usleep(100000); printf("%s\r", bar); fflush(stdout); } printf(" "); return 0; }

多文件编写升级版进度条

Version1

Linux第一个小程序——进度条插图(1)

main.c

#include"processbar.h"

int main()
{
  processbar();
  return 0;
}

processbar.h

#pragma once

#include

#define NUM 101
#define Body '='
#define Head '>'

void processbar();

processbar.c

#include"processbar.h"
#include
#include

const char *loading = "|/-\";

void processbar()
{
  char bar[NUM];
  int n = strlen(loading);
  memset(bar, '
#include"processbar.h"
#include
#include
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("
");
}
', 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(" "); }

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
#include
#include
#include
#include

#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, '
#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("
");
}
', 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(" "); }

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
本站无任何商业行为
个人在线分享 » Linux第一个小程序——进度条
E-->