如何完美控制控制台输出

1 前言

正常情况下,我们在控制台程序中只关注程序的输入和输出,而不在意输出的格式、光标位置等。
因此,当我们想要完美控制程序的输入输出时,就必须要使用系统提供的操作接口,来实现我们的目标。
由于linux平台的控制台显示完全由ANSI 转义序列控制,在这里仅仅讨论windows平台的实现。

2 接口

window系统提供了大量由于操作控制台的函数,以下列举了一些常用函数。

功能说明
CreateConsoleScreenBuffer创建控制台屏幕缓冲区。
FillConsoleOutputCharacter将字符写入控制台屏幕缓冲区指定的次数。
FlushConsoleInputBuffer刷新控制台输入缓冲区。
GetConsoleCursorInfo检索有关指定控制台屏幕缓冲区的光标大小和可见性的信息。
GetConsoleScreenBufferInfo检索有关指定控制台屏幕缓冲区的信息。
GetConsoleWindow检索与调用进程关联的控制台使用的窗口句柄。
GetNumberOfConsoleInputEvents检索控制台的输入缓冲区中未读输入记录的数目。
GetStdHandle检索标准输入、标准输出或标准错误设备的句柄。
PeekConsoleInput从指定的控制台输入缓冲区读取数据,而不将其从缓冲区中删除。
ReadConsole从控制台输入缓冲区读取字符输入,并将其从缓冲区中删除。
ReadConsoleInput从控制台输入缓冲区读取数据并将其从缓冲区中删除。
ReadConsoleOutput从控制台屏幕缓冲区中的字符单元格矩形块读取字符和颜色属性数据。
ReadConsoleOutputCharacter从控制台屏幕缓冲区的连续单元格复制多个字符。
ScrollConsoleScreenBuffer移动屏幕缓冲区中的数据块。
SetConsoleActiveScreenBuffer将指定的屏幕缓冲区设置为当前显示的主机屏幕缓冲区。
SetConsoleCursorInfo为指定的控制台屏幕缓冲区设置光标的大小和可见性。
SetConsoleCursorPosition设置指定控制台屏幕缓冲区中的光标位置。
SetConsoleMode设置控制台输入缓冲区的输入模式或控制台屏幕缓冲区的输出模式。
SetConsoleOutputCP设置与调用进程关联的控制台使用的输出代码页。
SetConsoleScreenBufferSize更改指定控制台屏幕缓冲区的大小。
SetConsoleTitle设置当前控制台窗口的标题。
SetConsoleWindowInfo设置控制台屏幕缓冲区窗口的当前大小和位置。
SetStdHandle设置标准输入、标准输出或标准错误设备的句柄。
WriteConsole从当前光标位置开始,将字符串写入控制台屏幕缓冲区。
WriteConsoleInput将数据直接写入控制台输入缓冲区。
WriteConsoleOutput将字符和颜色属性数据写入控制台屏幕缓冲区中的指定矩形字符单元格块。
WriteConsoleOutputCharacter将多个字符复制到控制台屏幕缓冲区的连续单元格。

3 示例

3.1 创建新的控制台

使用读写权限GENERIC_READ | GENERIC_WRITE创建控制台缓冲区,同时设置读共享FILE_SHARE_READ。(此处必须设置读共享,否终在替换缓冲区后无法从标准输入获取输入信息。)
创建句柄后,将创建的句柄设置为当前活动缓冲区,在不影响旧的缓冲区前提下,用新的屏幕替代。

  HANDLE hOutput = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,CONSOLE_TEXTMODE_BUFFER, NULL);// replace STD_OUTPUT_HANDLE with hOutputSetConsoleActiveScreenBuffer(hOutput);
3.2 设置无滚动条

Windows并未提供滚动条设置的相关接口,但是分析可以发现,之所以出现滚动条,是因为屏幕缓冲区的大小比实际窗口的大,因此才会出现纵向滚动条。
在此前提下,我们可以通过设置屏幕缓冲区的大小和窗口大小保持一致来隐藏滚动条。

  CONSOLE_SCREEN_BUFFER_INFO screen_info;// 获取当前缓冲区信息GetConsoleScreenBufferInfo(hOutput, &screen_info);// 根据窗口大小计算长宽height = screen_info.srWindow.Bottom - screen_info.srWindow.Top + 1;width = screen_info.srWindow.Right - screen_info.srWindow.Left + 1;// 设置屏幕缓冲区的大小SetConsoleScreenBufferSize(hOutput, {width, height});
3.3 获取标准输入

首先获取输入句柄,同时清空之前的消息。从控制台读取一个事件记录。
注意:所有的控制台读写函数都是阻塞的,因此可以通过GetNumberOfConsoleInputEvents 获取当前输入缓冲区中的事件数。

  HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);FlushConsoleInputBuffer(hInput);INPUT_RECORD record;common::ulong number;if (ReadConsoleInput(hInput, &record, 1, &number)) {// 判断是否键盘输入,且是按下按键操作if (record.EventType == KEY_EVENT && record.Event.KeyEvent.bKeyDown) {key = record.Event.KeyEvent.wVirtualKeyCode;}}
3.4 数据输出到屏幕

清楚指定位置的屏幕,同时在指定位置打印数据。

void Clear(COORD target) {common::ulong length = 0;// 使用空格字符覆盖指定的行,长度为窗口大小FillConsoleOutputCharacterA(hOutput, 0x20, width + 1, target, &length);
}void Print(const char* str, common::ulong len, COORD target) {common::ulong length = 0;// 清除旧数据Clear(target);// 从指定位置开始打印字符串WriteConsoleOutputCharacterA(hOutput, str, len, target, &length);
}

4 完整示例

Window 平台实现简单的进程信息查看。simple_taskmgr

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

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

相关文章

ABC322刷题记

ABC322刷题记 T1.A A - First ABC 2。 妥妥的简单题…… 用find函数做就行。(如果不存在那个子串就返回-1,否则返回第一次出现位置) 注意题目中编号是从1开始的。 时间复杂度:O(log(n))。find函数有一定代价,我记…

Qt 信号和槽执行线程问题

Qt 信号和槽执行线程问题 1.QObject的thread() 函数 在Qt中QObject有一个thread() 的函数。这就说明,每一个QOject对象都有所属的线程。 注意: QThread也是一个QObject的子类,也有自己所在的线程每个QObject存在父子关系,存在…

【Java-LangChain:面向开发者的提示工程-6】文本转换

第六章 文本转换 LLM非常擅长将输入转换成不同的格式,典型应用包括多语种文本翻译、拼写及语法纠正、语气调整、格式转换等。 本章节将介绍如何使用编程的方式,调用API接口来实现“文本转换”功能。 环境配置 参考第二章的 环境配置小节内容即可。 文…

java复习回顾

文章目录 0 开发工具1. 对象和类、三大特性2. 成员/实例变量和实例变量(this关键字)3. 方法重载overload4. 构造方法和this关键字5. 继承6. 访问修饰符7. 方法重写8. 继承下的构造执行9. 多态9.1 向上转型9.2 向下转型9.3 多态的应用 0 开发工具 Maven是…

Acwing 907. 区间覆盖

Acwing 907. 区间覆盖 知识点题目描述思路讲解代码展示 知识点 贪心 题目描述 思路讲解 代码展示 #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n;struct Range {int l, r;bool operator < (const Range &W) …

分页前后端完整代码

一、后端代码 User实体类要继承PageVo package com.like.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.like.common.PageVo; import…

借助ChatGPT的神奇力量,解锁AI无限可能!

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

计算机毕业设计 基于SSM的宿舍管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

时间序列-AR模型与MA模型的原理与实现

文章目录 1 自回归模型AR Model1.1 自回归模型 vs 多元线性回归模型1.1.1 线性回归1.1.2 AR(1)模型1.1.3 AR(p)模型 1.2 AR建模问题 2 移动平均模型 MA Model2.1 MA模型的数学表示2.1.1 MA(1)模型2.2.2 MA(q)模型 2.2 MA建模问题 ARIMA模型是AR模型&#xff08;自回归模型&…

使用 Python 给 PDF 添加目录书签

0、库的选择——pypdf 原因&#xff1a;Python Version Support Python 3.11 3.10 3.9 3.8 3.7 3.6 2.7 pypdf>3.0 YES YES YES YES YES YES PyPDF2>2.0 YES YES YES YES YES YES PyPDF2 1.20.0 - 1.28.4 YES YES YES YES YES YES P…

c语言练习74: 分割数组中数字的数位

分割数组中数字的数位 题⽬描述&#xff1a; 给你⼀个正整数数组 nums &#xff0c;请你返回⼀个数组 answer &#xff0c;你需要将 nums 中每个整数进⾏数位 分割后&#xff0c;按照 nums 中出现的 相同顺序 放⼊答案数组中。 对⼀个整数进⾏数位分割&#xff0c;指的是将整…

91、Redis - 事务 与 订阅-发布 相关的命令 及 演示

★ 事务相关的命令 Redis事务保证事务内的多条命令会按顺序作为整体执行&#xff0c;其他客户端发出的请求绝不可能被插入到事务处理的中间&#xff0c; 这样可以保证事务内所有命令作为一个隔离操作被执行。 Redis事务同样具有原子性&#xff0c;事务内所有命令要么全部被执…

2、【第一步】Qlib安装

Qlib安装 Qlib同时支持Windows和Linux。建议在Linux中使用Qlib。Qlib支持Python3,最高支持到Python3.8。 用户可以按照以下命令通过 pip 轻松安装 Qlib: pip install pyqlib同样,用户也可以按照以下步骤通过源代码安装 Qlib: 进入Qlib的根目录。然后,请执行以下命令来安装…

2024北京智慧养老展,北京养老应用软件展,北京陪护机器人展

2024第11届中国&#xff08;北京&#xff09;国际智慧养老产业展览会 The 2024 China (Beijing) international pension Industry Exhibition 时间&#xff1a;2024年04月10日—12日 展馆&#xff1a;北京亦创国际会展中心 承办&#xff1a;北京联诚国际展览有限公司 大会概要…

年度顶级赛事来袭:2023 CCF大数据与计算智能大赛首批赛题上线!

久等了&#xff01; 大数据与人工智能领域年度顶级盛事——2023 CCF大数据与计算智能大赛——首批赛题已上线&#xff0c;大赛火力全开&#xff0c;只等你来挑战&#xff01; 大赛介绍 CCF大数据与计算智能大赛&#xff08;CCF Big Data & Computing Intelligence Contes…

深入学习git

1、git原理及整体架构图 一些常用的命令 git add . 或 git add src/com/ygl/hello/hello.java 指定文件 git commit . 或 git commit src/com/ygl/hello/hello.java 指定文件 git push origin 分支名称 2、git stash的应用场景 场景一&#xff1a;你正在当前分支A开发&…

CA(openssl)

目录 创建私有CA 1、创建CA所需要的文件 2、生成CA私钥 3、生成CA自签名证书 申请证书并颁发证书 1、为需要使用证书的主机生成私钥 2、为需要使用证书的主机生成证书申请文件 3、在CA签署证书并将证书颁发给请求者 改变检查策略 4、查看证书中的信息 5、index.txt和…

多目标平衡黏菌算法(MOEOSMA)求解八个现实世界受约束的工程问题

目录 1 受约束的工程问题 1.1 减速器设计问题(Speed reducer design problem) 1.2 弹簧设计问题(Spring design problem) 1.3 静压推力轴承设计问题(Hydrostatic thrust bearing design problem) 1.4 振动平台设计问题(Vibrating platform design problem) 1.5 汽车侧面碰…

云安全【阿里云ECS攻防】

关于VPC的概念还请看&#xff1a;记录一下弹性计算云服务的一些词汇概念 - 火线 Zone-安全攻防社区 一、初始化访问 1、元数据 1.1、SSRF导致读取元数据 如果管理员给ECS配置了RAM角色&#xff0c;那么就可以获得临时凭证 如果配置RAM角色 在获取ram临时凭证的时候&#xff…

铁道货车通用技术条件

声明 本文是学习GB-T 5600-2018 铁道货车通用技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 90 mm90 mm。 B.2 制造要求 B.2.1 车体钢结构组成后&#xff1a; a) 敞车钢质侧、端板的平面度公差应小于或等于15 mm/m; 压型侧、端板的平面度…