🎉博主首页:
有趣的中国人
🎉专栏首页:
Linux
🎉其它专栏: C++初阶 | C++进阶 | 初阶数据结构
文章目录
1. 关于回车 & 换行
👨💻回车换行的概念
在Unix和类Unix系统(如Linux
和macOS
)中:通常使用换行字符(“\n
”)来表示换行。
在Windows系统中:,通常使用回车和换行的组合来表示换行,即"\r\n
"。
2. 简述缓冲区
👨💻缓冲区何时被清理
拿C语言举个例子:
在C语言中,标准库函数printf()
用于将格式化的数据打印到标准输出流(通常是终端)。但是,printf()
函数并不会立即将数据显示到终端上。相反,它会将数据写入到输出缓冲区中。输出缓冲区是一个临时存储区域,用于存放printf()
函数打印的数据,直到满足一定条件时才将其刷新(即将数据发送到终端并显示出来)。
这些条件包括:
3. 倒计时程序的编写
有了以上的知识储备,咱们就可以尝试编写一下简单的倒计时程序了,思路如下:
- 首先新建一个
time.c
文件,然后再用我们之前讲的makefile
工具来实现time.c
文件的自动构建:
- 编写
time.c
这个文件,实现思路:
🌝详细代码如下:
#include <stdio.h>
#include <unistd.h>
int main()
{
int cnt = 10;
while(cnt >= 0)
{
// 打印的时候每次覆盖上一次出现的数字
printf("倒计时:%2d\r",cnt);
// 强制冲刷缓冲区
fflush(stdout);
--cnt;
sleep(1);
}
printf("\n");
return 0;
}
- 用
make
命令进行编译:(⏳这边就可以动态运行了哈,感兴趣的可以自己试一下⌛)
- 这里有个小拓展,如果我们要覆盖上次的数字是4位,这次是三次(比如1000到999),可以用
%4d
这个输出形式来解决,也可以用下面这种方法:
#include <stdio.h>
#include <unistd.h>
int main()
{
int cnt = 1000;
int tmp = cnt;
int num = 0;
while (tmp)
{
++num;
tmp /= 10;
}
while(cnt >= 0)
{
// 主要就是这里的变化,用最大数字的位数来做占位符
printf("倒计时:%*d\r",num, cnt);
fflush(stdout);
--cnt;
sleep(1);
}
printf("\n");
return 0;
}
4. 简易进度条的实现
👨💻效果图展示
👨💻实现思路
1. 动态加载的过程
2. 进度加载
3. 动态旋转
👨💻具体代码实现
#include "process_bar.h"
#include <memory.h>
#include <unistd.h>
#define style '#'
#define round "-\\/-"
void test()
{
int i = 0;
char str[100];
memset(str,'\0',sizeof(str));
while (i <= 100)
{
str[i] = style;
printf("[%-100s][%d%%][%c]\r",str,i,round[i % 4]);
fflush(stdout);
++i;
usleep(10000);
}
printf("\n");
}
👨💻第二版本
对于要下载的文件,肯定有文件大小,下载的时候网络也有它的带宽,所以在下载的时候,每次下载的大小都是一个带宽,我们可以先写一个下载的函数:
download函数:
void download()
{
double bandwidth = 1024 * 1024 * 1.0;
double filesize = 1024 * 1024 * 10.0;
double cur = 0.0;
while (cur <= filesize)
{
// 调用进度条函数
test(filesize, cur);
// 每次增加带宽
cur += bandwidth;
usleep(20000);
}
printf("\n");
printf("this file has been downloaded\n");
}
进度条函数:
void test(double total, double current)
{
char str[101];
memset(str,'\0',sizeof(str));
int i = 0;
// 这次的比率
double rate = (current * 100) / total;
// 循环次数
int loop_count = (int)rate;
while (i <= loop_count)
{
str[i++] = style;
}
printf("[%-100s][%.1lf%%][%c]\r",str,rate,round[loop_count % 4]);
fflush(stdout);
}
回调函数版本(完整):
// 头文件 process_bar.h
#include <stdio.h>
typedef void(*callback_t)(double, double);// 函数指针(回调函数)
void test(double total, double current);
// 函数实现文件 process_bar.c
#include "process_bar.h"
#include <memory.h>
#include <unistd.h>
#define style '#'
#define round "-\\/-"
void test(double total, double current)
{
char str[101];
memset(str,'\0',sizeof(str));
int i = 0;
double rate = (current * 100) / total;
int loop_count = (int)rate;
while (i <= loop_count)
{
str[i++] = style;
}
printf("[%-100s][%.1lf%%][%c]\r",str,rate,round[loop_count % 4]);
fflush(stdout);
}
// main.c 主函数和 download 函数
#include "process_bar.h"
#include <unistd.h>
double bandwidth = 1024 * 1024 * 1.0;
void download(double filesize, callback_t cb)
{
double cur = 0.0;
while (cur <= filesize)
{
cb(filesize, cur);
cur += bandwidth;
usleep(20000);
}
printf("\n");
printf("this file has been downloaded\n");
}
int main()
{
download(1024*1024*100.0,test);
download(1024*1024*20.0,test);
return 0;
}