当前位置: 首页 > news >正文

『Linux小程序』进度条

文章目录

    • 缓冲区问题
    • 回车与换行的区别
    • 进度条小程序

缓冲区问题

假设有一段代码为:

#include<iostream>                                  
#include<unistd.h>                                                       int main()                              {                                                  std::cout<<"it's a file for Proc"<<std::endl;sleep(3);return 0;}         

编译后运行为正常,先打印后等待三秒结束程序;
在这里插入图片描述
但若是将其中的换行endl删除再次编译运行将会一样吗;

在这里插入图片描述

答案为否 为什么不是先打印后sleep而是先sleep后打印呢 这里存在一个缓冲区问题
毋庸置疑的是,该处执行的顺序一定是先打印后sleep

在这里确实是先进行打印而后再执行sleep,但是这里执行打印后并没有将信息显示出来;

在c/C++中存在一个输出缓冲区(c/C++所提供的一段内存空间);

这个输出缓冲区并并不是马上进行刷新,而是根据特定的刷新策略来进行刷新;

对于一般的显示器设备,一般的刷新策略即为遇到换行时,就把换行前的所有字符全部进行显示
若是想直接进行刷新则可以调用

fflush(stdout);

进行刷新;

在这里插入图片描述
从该处可以看出,在程序遇到fflush(stdout)时马上进行了刷新;

该函数即为立马刷新输出缓冲区;

对于输出缓冲区来说一般是不会造成溢出的,当输出缓冲区到达一定的量时将会强制进行刷新,并将新数据写入进输出缓冲区;
​ 同时,对于打印等函数来说并不是直接将内容直接打印到显示器上,而是通过打印函数暂时存储到了输出缓冲区中;

回车与换行的区别

在c/C++中,尤其是在c语言中,大多数人习惯使用’\n’进行换行;

但是其实来说,换行与回车是有区别的,对于换行来说,单换行并不能使光标回到最开始的位置;

在这里插入图片描述
而对于回车来说,回车的真正意义为归位,即将光标恢复到最开始的位置;

在这里插入图片描述
然而在大部分场景中,键盘中的回车键都会被默认为换行+回车;

即为换行后再将光标恢复到首位;

在c/c++中也是如此,‘\n’将会默认为 换行+回车 ,即’\n’ + ‘\r’ ;

从该处可以进行一个实验;

#include<iostream>  
#include<unistd.h>  int main()  {  int count = 5;  while(count>=0){  std::cout<<"当前剩余:"<<count<<std::endl;                           sleep(1);                             --count;                              }                                       return 0;                               }                   

运行后:请添加图片描述


每次都会打印数据并进行换行回车,因为这里使用了endl,其功能与’\n’相同;

而若是将cout换成’\r’将会是什么情况?

当讲cout换成 ‘\r’ 时则什么都不会打印;
原因即为;
'\r’只是纯回车,并不是换行,而缓冲区当遇到换行时才会进行刷新;

若是在此处加上fflush(stdout)将会进行每次回车的功能;

这次并不会每次都进行换行,而是每次进行回车,同时内容也将重新覆盖,从而得到一个类似于倒计时的功能;

进度条小程序

根据上述的所有内容可以制作一个进度条,即主要结合 ‘\r’ 回车来进行操作;

#include<iostream>#include<unistd.h>#define NUM 51int main(){char s[NUM];int count = 0;std::string C("|/-\\");while(count <  NUM){printf("[%-50s][%-4d%%][%c]\r",s,count*2,C[count%4]);fflush(stdout);s[count++] = '=';s[count+1] = '\0';  usleep(100000);}std::cout<<std::endl;return 0;}

在这里插入图片描述

http://www.lryc.cn/news/193056.html

相关文章:

  • 【手写数字识别】GPU训练版本
  • c#-特殊的集合
  • Android 使用 eChart 设置标线
  • 红队专题-Cobalt strike 4.x - Beacon重构
  • 一文掌握 Go 文件的写入操作
  • 小程序入门及案例展示
  • linux 安装python django pip 遇到的问题
  • 【问题解决】【爬虫】抓包工具charles与pycharm发送https请求冲突问题
  • Hadoop3教程(二):HDFS的定义及概述
  • 【物联网+JAVA 】智慧工地源码
  • 001数据安全传输-多端协议传输平台:Openssl安装和配置 - EVP代码测试
  • 关于小编入坑第512天
  • VS2015编译Qt工程发生MSB4018错误完整解决过程
  • 如何使用JMeter测试导入接口/导出接口
  • [入门一]C# webApi创建、与发布、部署、api调用
  • 关于Vue+webpack使用unocss编写CSS,打包后CSS没加前缀
  • 软件工程与计算总结(十一)人机交互设计
  • Jmeter组件执行顺序与作用域
  • 第一天商城项目
  • C++笔记之通用多态函数包装器std::function
  • Linux命令(92)之passwd
  • 光电柴微电网日前调度报告
  • Godot 单元测试
  • 2.9 深入GPU硬件架构及运行机制
  • 【苍穹外卖 | 项目日记】第四天
  • 零代码编程:用ChatGPT批量采集bookroo网页上的英文书目列表
  • 7.定时器
  • 计算机网络 | 网络层
  • 21GA-ELM,遗传算法优化ELM预测,并和优化前后以及真实数值进行对比,确定结果,基于MATLAB平台,程序已经调通,可以直接运行,需要直接拍下。
  • 287_C++_TaskQueue管理任务队列和定时器(头文件.h)