文章目录
- 一、准备知识
-
- 1.回车与换行
-
- [1.1 回车](#1.1 回车)
- [1.2 换行](#1.2 换行)
- [2. 行缓冲区](#2. 行缓冲区)
- [3. 倒计时程序](#3. 倒计时程序)
- 二、进度条程序
- [1. 版本1](#1. 版本1)
一、准备知识
在讲解进度条之前,先讲解几个概念
1.回车与换行
1.1 回车
回车:\r
作用:将光标移动到当前行的行首(水平回退,不换行)。
1.2 换行
换行:\n
作用:将光标移动到下一行的同一列(垂直移动,不回退)。
历史渊源:打字机时代,"回车"(Carriage Return)是让滚筒归位,"换行"(Line Feed)是推动纸张换行,两者需配合使用。
在 Windows 系统中,按下 Enter 键会产生回车(Carriage Return,\r)和换行(Line Feed,\n)两个动作,即 "\r\n" 组合。
2. 行缓冲区
先来看两个不同的现象:
有换行:
没有换行:
这种情况下,为什么"hello l1bo"
不直接显示呢?没有显示,它去哪里了呢?
"hello l1bo"
没有消失,而是暂时存储在 stdout 的缓冲区中,直到程序结束才被刷新到屏幕。
缓冲区的刷新策略是行刷新,需要 \n 或手动刷新来触发显示。
如果想让"hello l1bo"
立即显示,需要强制刷新缓冲区
c
#include <stdio.h>
#include <unistd.h>
int main() {
printf("hello l1bo");
fflush(stdout); // 强制刷新缓冲区
sleep(2);
return 0;
}
3. 倒计时程序
每次输入后,光标都会移动到下一个位置
如果我们输入完一个数字后把光标回到原来位置,再次输入,重复上面的动作,也就可以形成倒计时小程序了。其实就是利用\r
回车实现。
版本1:不复原光标位置
版本2:不强制刷新
版本3:
优化:
版本4:两位数字倒计时
优化:
%-2d
,-
表示左对齐,2
表示占两个字符位置
二、进度条程序
1. 版本1
实现以下基本功能,只展示进度条基本功能,后面还有V2版本。
第一步:创建一个process
目录用来存放代码,并且把之前的Makefile文件拷贝到process目录中来,可以修改一下Makefile的可执行程序名称,不想改也可以不改。
第二步:创建process.h, process.c, main.c
这三个文件
process.h
写函数声明,process.c
写函数实现,main.c
写
第三步:初步填写代码