目录
在写小程序之前先来了解两个知识点
一、缓冲区
缓冲区(buffer),它是内存空间的一部分。也就是说在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或者输出的数据,这部分预留的空间就叫做缓冲区,显然这种缓冲区是具有一定大小的。
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
接下来我们用一段简单的代码看下缓冲区在代码中的作用
这段代码的结果是程序会休眠3秒,然后再打印字符串you can see me之后结束运行。
为什么会出现这种情况,不应该是打印字符串后再休眠3秒吗?
这是因为在执行printf时,字符串被写入到了C程序的缓冲区里,但并没有输出到显示器上,执行完sleep后,缓冲区的内容才被刷新到显示器上。
这就得了解下缓冲区刷新的规则:
- 行刷新
- 程序结束
- 强制刷新
上面示例的情况属于程序结束时刷新 ,但如果在字符串后面加上'\n' 就属于行刷新。
补充:
这里要介绍一个接口函数:fflush -- 强制刷新(刷新一个流)
c语言在打开时会默认打开三个流:stdin、stdout、stderr
所以如果想要显示所输入的字符串,可以使用fflush来强制刷新stdout
二、回车与换行
回车:换到当前行的开头
换行:换到当前光标对应的下一行的位置
'\n' --> 回车 + 换行
'\r' --> 回车
三、进度条
1、版本一
头文件
1 #pragma once
2
3 #include<stdio.h>
4 #include<unistd.h>
5 #include<string.h>
6 #include<time.h>
7 #include<stdlib.h>
8
9 #define NUM 103
10 #define Body '='
11 #define Head '>'
12
13
14 typedef void (*callback_t)(double);
15
16 //version1
17 void process();
源文件
#include"processbar.h"
2
3
4 const char *lable="|/-\\";
5
6 //version1
7 void process()
8 {
9 //const int n = 101;
10 //char buffer[n]; //C语言是编译不通过的
11
12 char buffer[NUM];
13 memset(buffer, '\0',sizeof(buffer));
14 int cnt = 0;
15 int n = strlen(lable);
16 buffer[0] = Head;
17 while(cnt <= 100)
18 {
19 printf("[%-100s][%3d%%][%c]\r", buffer, cnt, lable[cnt%n]);
20 fflush(stdout);
21 buffer[cnt++] = Body;
22
23 if(cnt < 100)
24 buffer[cnt] = Head;
25
26 usleep(100000);
27 }
28
29 printf("\n");
30 }
结果:
2、版本二
由于一个真正的进度条不是一个独立的程序,而是要依附于其他程序才能实时显示进度。
但是在写程序之前,我们要讲两个知识点:回调函数和函数指针
在了解到这两个知识点后,我们就用三个文件来实现版本2的进度条
main.c:调用
processbar.c:实现
processbar.h:声明
结果: