了解知识
换行(\n)和回车(\r)的区别:
- <\r>回车(carriage return):即每次打印完使光标回到最开始位置
- <\n>换行(line feed):换到当前行的下一行,即光标指向下一行最开始的位置
缓冲区概念
缓冲区分为:无缓冲、行缓冲、全缓冲。
- 无缓冲:表示的是没有缓冲,可以将信息立马显现出来,典型代表是标准错误流stderr。
- 行缓冲:表示的是输入输出遇到换行才执行真正的I/O操作。典型的代表是键盘的操作。
- 全缓冲:表示的是输入输出写满缓冲区才执行I/O操作。典型的代表是磁盘的读写
关于行缓冲有3个实例:
现象是什么?
先打印Hello,world!
三秒后换行打印apple@AppledeMacBook-Pro Linux %
现象是什么?
停顿3秒后先打印Hello,world!%
(这里为啥跑出来了 % 我也不是很懂),再换行打印apple@AppledeMacBook-Pro Linux %
现象是什么?
停顿3秒后先打印Hello,world!
,再换行打印%,并换行打印apple@AppledeMacBook-Pro Linux %
结论:
printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷新缓冲区的条件如下:
-
缓冲区填满;
-
写入的字符中有‘\n’ ,’\r’;
-
调用fflush手动刷新缓冲区;
-
调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新;
满足上面4个条件之一缓冲区就会刷新
fflush
功能: 清除读写缓冲区,在需要立即把输出缓冲区的数据进行物理写入时
-
fflush(stdin):刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准]
-
fflush(stdout):刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上
usleep
usleep函数能把进程挂起一段时间, 单位是微秒(千分之一毫秒)。本函数可暂时使程序停止执行。头文件:<unistd.h>
进度条小程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
char arr[102] = {0};
const char* lp = "|/-\\";
for(int i = 0; i < 100; i++){
arr[i] = '#';
printf("[%-100s][%d%%][%c]\r", arr, i+1, lp[i % 4]);
fflush(stdout);
usleep(100000);
}
printf("\n");
return 0;
}
代码生成图
如有不同见解,欢迎留言讨论~~