Linux的第一个小程序
1、\r&&\n
- 回车概念
- 换行概念
- 老式打印机的例子
2、行缓冲区概念
运行程序是什么现象 ❓
可以看到输入 “hello bit” 后,程序停留 5 秒后退出程序
运行程序是什么现象 ❓
这里输出时把 \n 去掉
可以看到字符串没带 \n ,程序停留 5 秒后再输出 “hello bit”
sleep 比 printf 先执行 ?
这是顺序结构,此处并没有判断、分支啥的,那肯定是从上至下执行。
其实这里 sleep 时,printf 已经执行了,也就是说,printf 已经执行了,并不代表信息会被我们看到。
在 sleep 期间,字符串存在哪 ?
这也是之前我们学过的一个概念 —— 缓冲区(在 C 语言进阶篇我们验证了它的存在 —— C文件操作),对于这个概念,在之前甚至到这篇文章结束,我们对它的理解都是浅薄,甚至是错误的,真正要理解缓冲区,大概会在 Linux 系统编程部分,学习基础 IO 后,才会真正理解 C/C++ 中的缓冲区。在此之前我们可以理解为,缓冲区本质上是一段内存空间,它可以暂存临时数据,在合适的时候刷新出去。其中这里:
【缓冲区在哪】
【缓冲区谁提供的】
【缓冲区刷新是谁刷新的,以及什么时候刷新,刷新到哪】
【为什么要存在缓冲区】
上面提到的问题,现阶段是不好回答的。
在此章中我们要了解的是 ”刷新" ?
刷新策略:
- 直接刷新,不缓冲
- 缓冲区写满,再刷新 —— 全缓冲
- 碰到 \n 就刷新 —— 行刷新(一般对应的设备是显示器)
- 强制刷新
注意这里的刷新指的是,把数据真正的写入磁盘、文件、显示器、网络等设备或文件。
之前也说过,任何一个 C 程序,在启动时,会默认打开三个流(它们的类型都是 FILE*):
- stdin 标准输入流 - 键盘
- stdout 标准输出流 - 屏幕
- stderr 标准错误流 - 屏幕
最后再解释下这里的现象,这里是往显示器上显示,默认的刷新方案是行刷新,而如上并没有 \n,所以不会刷新,只能把缓冲区写满或程序结束才能刷新,所以为了让它显示出来,需要强制刷新 fflush(stdout)
回车 vs 换行 ❓
回车和换行本质上是一个不同的概念。
很明显,当我们写完一行,使用换行继续写时,写入的位置是错误的。我们想让它换行后,写入的位置回到开头,这种方式叫回车。其实 \n 是有两种身份 —— 换行并回车,简称回车,如果只想换行呢,就可以使用 \r。
所以在一些老式键盘上,它的 Enter 键是这样的,往下换行,往左回车,按 Enter 就是换行并回车。
3、倒计时代码
原理:回车不换行,依次覆盖,使用 \r,需要注意的是没使用 \n,不能刷新,所以需要强制刷新
验证:
但是这里还有个问题,当 count 是从 10 开始时
现象:
根本原因是 10 是两个字符,所以这里每次回车覆盖时都只会覆盖第一个字符。这里我们就要有一个基本的理解 —— 显示器和键盘这样的设备统称为字符设备,体现在输入是字符,输出是字符,只不过被 scanf、printf 给格式化了,变成我们看到的数字了。
解决方法就是加上位宽来控制
验证:
4、进度条代码
效果图如下:
验证:
📝说明
在 Linux 中 sleep 是以秒为单位,usleep 是以微秒为单位的。
扩展一下,我们的 C/C++ 是支持颜色输出的 —— printf 默认输出的颜色是终端的颜色,如果想设置其它颜色,就需要用到控制命令:\033[m,控制命令以 033[ 开头,以 m 结尾,而中间是属性码,属性码之间用 ; 分隔。具体可以去百度 printf 颜色配置方案。
- 点赞
- 收藏
- 关注作者
评论(0)