如何使用C/C++刷新修改已经打印显示在终端上的内容

news2025/1/12 5:52:27

写本文的起源是因为在安装一些工具的时候,发现在终端上并行安装的情况下,显示安装信息是会修改之前已经打印出来的内容,这是怎么做到的呢?抱着对这个问题的好奇我进行了一些探索。

终端是如何运行的

首先是最关键的问题:终端是如何运行的?

这个问题并不是我思考的第一个问题,但是在写本文的时候,我认为这是最关键的问题,思考了这个文件,那么面对一些问题就很好解释了:

下面介绍一下标准输出(stdout)和 C/C++ 之间的工作流程:

第一,标准输出(stdout)是一个只读文件,并不能进行修改,终端将会显示这些内容。
第二,如果是 C 语言,那么printf()将内容输出到标准输出(stdout)中,然后终端将会显示这些内容。
第三,如果是 C++,那么cout将会输出内容到缓冲streambuf中,最后在合适的机会将其传递给标准输出stdout中打印出来,比如说遇到fflush()刷新或者\n换行符的时候。

可能你对上面的一些点还是很迷惑,下面仔细来说说看。

刷新单行内容的最佳方法

如果是单行刷新,可以使用转义字符\r\b:前者将会跳转到这行的开头再打印,而后者会移到前一个字符的位置再打印(带入一下旧式的打字机就可以理解了)。

举个例子,在同一行里,从1循环到100,既可以使用\b\b\b(因为最大是三位数):

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    int i = 1;
    while (i<=100) {
        printf("%d\b\b\b", i++);
        //休眠一秒再进入下次循环,不然显示太快了
        sleep(1);
    }
    return 0;
}

比较推荐使用\r,这样就可以应对不同长度的数字。

但是二者在stdout中的内容并不会被覆盖,而是如下情况:

1\r2\r3\r4\r.......

所以如果需要刷新多行内容这种方法就不行了。因为\r\b本质上并不是删除了之前的内容,而是在这里跳转了光标进行重新渲染输出,标准输出中的内容并没有发生任何改变。而且二者的跳转都是横向跳转的,\n是纵向的变化。

那么多行刷新应该怎么办呢?

多行内容刷新的解决方案一:使用 ANSI Code

这是一个诞生于上世纪七十年代的产物,它被用于控制终端上光标的位置、颜色、字体等属性。ANSI Code 本质是一个 ASCII Code 的组合,也是一种转义字符,结构为\033[XX\033在 ASCII 中就是 “ESC”的意思,转义字符的英文就是 “Escape Character”),并且广泛应用于众多类 Unix 系统的终端中。

如果想打印出下面这样的情况(只刷新第一行的数字):

39
倒计时中

那么就可以使用下面的代码(注意还是使用了\r,因为当前光标上移可能是在中间或最后的位置):

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    int i = 1;
    while (i<=100) {
        printf("%d\n", i++);
        printf("倒计时中\033[A\r");
        sleep(1);
    }
    return 0;
}

此外个人建议如果使用这种方法,最好在循环外加上printf("\n");,不然结束程序也可能会影响显示。

这里有篇文章记录了各种移动光标的转义字符,可以当做手册查看:《Bash Prompt HOWTO: Chapter 6. ANSI Escape Sequences: Colours and Cursor Movement》

你如果和我一样遍历过/bin,那么你可能会发现知道ls列出的第一个程序就是[(又名test),也是确定“condition”的。不过这个是评估条件的,而不是位置的(这句话是一个小双关),和 ANSI Code 并没有任何关系,只是巧合。

多行内容刷新的解决方案二:使用ncurses或Windows Console API

这种方法需要使用其他的库,根据平台选择 ncurses(类 Unix)或Windows Console API(Windows)。

个人不是很推荐这种方法:

  • 第一,不是自带的,有些终端不能用;
  • 第二,编译构建安装的时间有点长;
  • 第三,这种方法类似less会新建一个窗口或者清空窗口进行显示。这种方法的样式不是我需要的。

不过作为技术储备,我还是进行了一些研究。

ncurses 的下载地址为https://invisible-island.net/ncurses/#download_ncurses。

下载之后,解压配置安装的命令如下:

$ tar zxvf ncurses-xxx.tar.gz
$ cd ncurses-xxx
$ ./configure
$ make -j4 
$ sudo make install 

安装好了之后,编译的时候使用-lncurses连接库即可。下面是官方的一个案例,这里假设这个文件为hello.c

#include <ncurses.h>

int main()
{	
	initscr();			/* Start curses mode 		  */
	printw("Hello World !!!");	/* Print Hello World		  */
	refresh();			/* Print it on to the real screen */
	getch();			/* Wait for user input */
	endwin();			/* End curses mode		  */

	return 0;
}

编译命令为:

$ cc hello.c `-lncurses

然后运行即可看到结果:

请添加图片描述

这里有很详细的官方文档:https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/可以看看。

希望能帮到有需要的人~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1105295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文了解数据管理框架以及数据战略制定方法

这一节主要介绍数据管理这一章的另一重要部分&#xff0c;也就是我们在数据管理经常使用到的数据管理框架以及数据战略制定方法。 要制定数据管理框架&#xff0c;或者是组织需要制定数据治理规划或数据管理规划&#xff0c;需要首先制定与业务战略对齐的数据战略。 01、数据…

图片转base64

图片转 base64 我们将展示如何将图片转换为 base64 编码&#xff0c;并演示如何读取选择的文件并显示在页面中。 base64 编码转换 const a atob("sasd"); // 将 base64 编码转换为原始字符串 console.log(a); // sasdconst b btoa(a); // 将原始字符串转换为 ba…

集结AI创新力量,“华为云杯”2023人工智能应用创新大赛圆满落幕

在AI梦想照进现实的同时&#xff0c;一场历时近三个月的“华为云杯” 2023 人工智能应用创新大赛终于落下帷幕。自6月份启动以来&#xff0c;此次大赛在全国范围内汇聚AI人才、聚焦AI应用场景创新&#xff0c;今年大赛吸引了来自全国各地的5714名优秀精英和153个优秀团队报名参…

00TD时尚儿童穿搭,这件小熊毛衣太好看了吧

寒冷的秋冬季怎么少的了毛衣呢 软糯亲肤又时尚百搭的款谁不爱 除了纯色还有条纹设计 可爱小熊图案可爱又吸睛 经典时尚的款怎么穿都好看哦&#xff01;

二叉树的前 中 后序的非递归实现(图文详解)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

在亚马逊云科技Amazon SageMaker上进行Stable Diffusion模型训练和推理

Stable Diffusion Quick Kit是一个基于亚马逊云科技Amazon SageMaker进行Stable Diffusion模型快速部署的工具包&#xff0c;包括了一组示例代码、服务部署脚本、前端UI&#xff0c;可以帮助可以快速部署一套Stable Diffusion的原型服务。 本文将介绍如何在SageMaker Training …

想要上抖音同城热搜榜很难吗

首先&#xff0c;我们需要了解抖音同城热搜榜的推荐机制。抖音采用了先进的推荐算法&#xff0c;根据用户的行为、兴趣和社交关系进行内容推荐。一个具有话题性的内容往往能够引发用户的讨论和传播。在创作过程中&#xff0c;可以从热门事件、潮流话题、地域特色等方面切入&…

VB.Net 任务管理器相关操作

WindowsExplorer 任务管理器 程序对进程文件操作类&#xff1a;&#xff08;实例&#xff09; 1、打开进程文件目录 2、激活窗口&#xff08;有主窗口的程序&#xff09; 3、关闭程序&#xff08;向进程文件发送关闭指令&#xff09; 4、结束进程 5、挂起 6、恢复挂起 …

MDNNSVM

介绍 h v , l ^{v,l} v,l σ \sigma σ((W v , l ) T ^{v,l})^T v,l)Th v , l − 1 ^{v,l-1} v,l−1b v , l ^{v,l} v,l) h 1 ^1 1 σ \sigma σ( ∑ v 1 V \sum_{v1}^V ∑v1V​W v , L 1 ) T ^{v,L1})^T v,L1)Th v , L ^{v,L} v,Lb v , L 1 ^{v,L1} v,L1) h 1 ^1 1是融合DN…

群晖synology DSM 7.2设置钉钉Webhooks通知

现在越来越多的小伙伴都有了自己的Nas系统&#xff0c;为了更加方便的接收Nas的消息&#xff0c;这篇文章带着大家一起配置一个钉钉&#xff08;机器人&#xff09;即时消息通知 首先登录钉钉的开放平台&#xff1a;开发者后台统一登录 - 钉钉统一身份认证 1.创建一个机器人&…

getBoundingClientRect使用场景(table固定表头)

getBoundingClientRect()用于获得页面中某个元素的左&#xff0c;上&#xff0c;右和下分别相对浏览器视窗的位置&#xff0c;是DOM元素到浏览器可视范围的距离&#xff08;不包含文档scroll的部分&#xff09;。该函数返回一个Object对象&#xff0c;该对象有6个属性&#xff…

【前端学习】—箭头函数和普通函数的区别(十四)

【前端学习】—箭头函数和普通函数的区别&#xff08;十四&#xff09; 一、箭头函数和普通函数的区别 const obj{fullName:zz,sayName(){console.log(this.fullName,this.fullName)//zz}}obj.sayName();const obj{fullName:zz,sayName:()>{console.log(this.fullName,this…

魔行观察》一款免费的品牌/商业地产数据查询平台

给大家推荐一款免费的商业数据查询平台"魔行观察"&#xff0c;可免费查询品牌&#xff0c;品牌门店&#xff0c;商场&#xff0c;全国小区&#xff0c;写字楼等相关信息&#xff0c;更多数据敬请期待 小程序搜索&#xff1a;魔行观察 即可使用

光致发光荧光量子检测溶液有哪些优点?

光致发光荧光量子检测是一种测试技术&#xff0c;可以用来测量荧光材料的荧光光谱、荧光量子效率和发光寿命等参数&#xff0c;具有高灵敏度、高分辨率和自动化程度高等优点。在溶液状态下&#xff0c;荧光材料会吸收一定波长的光能并释放出次级光&#xff0c;即荧光&#xff0…

77.每日一练:迭代器遍历容器(牛客)

目录 问题描述&#xff1a; 代码解决以及思想 知识点 问题描述&#xff1a; 代码解决以及思想 #include <iostream> // write your code here...... #include <vector>using namespace std;int main() {// write your code here......vector<int> v;for (…

WMS系统盘点管理

一、定义 WMS系统的盘点管理是指对仓库内的物料、商品和库存进行周期性或特定时点的实际数量核对和比对系统记录的过程。它旨在确保仓库库存的准确性&#xff0c;发现和纠正库存偏差&#xff0c;并提供可靠的库存数据供企业决策使用。 二、流程 WMS系统盘点管理的流程通常包括…

深度学习 | CNN卷积核与通道

10.1、单通道卷积 以单通道卷积为例&#xff0c;输入为&#xff08;1,5,5&#xff09;&#xff0c;分别表示1个通道&#xff0c;宽为5&#xff0c;高为5。 假设卷积核大小为3x3&#xff0c;padding0&#xff0c;stride1。 运算过程&#xff1a; 不断的在图像上进行遍历&#…

Java对象数组练习

定义数组存储三个商品对象&#xff0c;商品的属性&#xff1a;id&#xff0c;名字&#xff0c;价格&#xff0c;库存&#xff0c;创建三个商品对象&#xff0c;并把商品对象存入到数组中 public class Goods {private String id;private String name;private double price;pri…

【深度学习基础知识(一):卷积神经网络CNN基础知识】

深度学习基础知识 深度学习基础知识&#xff08;一&#xff09;&#xff1a;卷积神经网络CNN基础知识 卷积神经网络CNN基础知识 0、目录 1. CNN卷积神经网络的特点 2. 卷积操作基础知识 2.1 卷积操作的概念2.2 卷积操作的种类2.3 卷积操作后特征图谱大小计算公式 3. 池化操…

定制化推送+精细化运营,Mobpush助力《迷你世界》用户留存率提升23%

随着智能设备的市场下沉&#xff0c;手游市场迎来了爆发式增长&#xff0c;《迷你世界》作为一款于2015年推出的手游&#xff0c;一经问世就饱受欢迎。上线短短三年&#xff0c;迷你世界在应用商店下载量已经高达2亿次&#xff0c;周下载量两千万&#xff0c;稳居第一名&#x…