Ubuntu下编写终端界面交互式C++小程序的一些Trick(小技巧,gnome-terminal)
类getch()功能的实现
I
只要在Windows下用过C/C++就会很熟悉conio.h
库中的一个函数getch()
,它可以绕过终端输入缓冲区直接从键盘读取一个字符,并且不在界面上显示。
但如果想直接在Linux环境下用是不行的,因为没有conio.h
库的支持。
博主翻了网上的一些资料,在这里给出一个比较简明的实现,使用起来与Windows下没什么差异。
#include<cstdio>
#include<cstdlib>
inline char getch(){
static char ch;
system("stty -icanon -echo");
scanf("%c",&ch);
system("stty icanon echo");
return ch;
}
II
不知道大家有没有遇到这样的问题:平时所见的输入语句都需要等待我们输入完才会执行完成,什么都不做的话就会一直阻塞在那里。但我们有时想让程序在尝试接收读入失败的时候能够继续执行下去。这样要怎么实现呢?
我们需要一个函数fcntl
,包含在fcntl.h
中。使用它可以取消输入阻塞。关于它的更详细的内容可以百度。
我们还需要一个函数read
,包含在unistd.h
中,是一个底层的输入函数。
定义一个CustomGetch
类,包含构造函数、析构函数和运算符()
重载,再定义一个该类变量getch
,用起来就像函数一样。
#include<cstdlib>
#include<fcntl.h>
#include<unistd.h>
class CustomGetch{
public:
CustomGetch(){
fcntl(0,F_SETFL,O_NONBLOCK);
system("stty -icanon -echo");
}
~CustomGetch(){
fcntl(0,F_SETFL,0);
system("stty icanon echo");
}
inline char operator()(){
static char ch;
return ~read(0,&ch,1)?ch:EOF;
}
}getch;
这样写有一个局限性:在这个变量的生存周期内,不能和其它的输入方式兼容。因此有两种处理方案:
- 在需要
getch()
而不需要其它输入方式的语句块内定义临时变量。 - 直接像I中的那个
getch()
一样写成函数。但考虑到实际应用中要频繁调用这个函数对输入流进行检查,而system
操作相当耗时,所以不推荐这样做。
清屏
因为system("clear")
是个假的清屏,所以我们需要更好的实现。
printf("\033c");
对,没了,就一行。
程序示例
#include<cstdio>
#include<cstdlib>
int main(){
for(int i=0;;++i){
printf("\033c");
for(int j=0;j<4;++j)puts(1&i?"abcdefg":"abcbefg");
system("sleep 1");
}
return 0;
}
更改输出起始位置、输出字体颜色
Linux终端有专门的转义字符。看这个博客
Ubuntu下编写终端界面交互式C++小程序的一些Trick(小技巧,gnome-terminal)的更多相关文章
- 在ubuntu下编写python(python入门)
在ubuntu下编写python 一般情况下,ubuntu已经安装了python,打开终端,直接输入python,即可进行python编写. 默认为python2 如果想写python3,在终端输入p ...
- 【linux基础】Ubuntu下的终端多标签切换快捷键
method: 方法一: alt+ alt+ alt+ 方法二: ctrl + pageUp ctrl + pageDown 方法三: Edit--> Keybord Shortcuts 到这里 ...
- 微信小程序开发详解——小程序,大颠覆!
微信小程序开发 联系 苏念 188.1414.7927 微信小程序系统开发 微信新功能开发 小程序开发 小程序怎么开发 app小程序开发 简化小程序开发 微信小程序定制 小程序制作 开发微信小程序 ...
- 微信小程序快速移植支付宝小程序
移植背景: 1. 支付宝小程序开发文档只了解了大致框架,跑了demo,具体Api.组件没太多了解: 2. 已有微信小程序,移植支付宝小程序做预研(主要针对授权登录.支付等功能). 3. 移植的微信小程 ...
- [转]微信小程序之购物车 —— 微信小程序实战商城系列(5)
本文转自:http://blog.csdn.net/michael_ouyang/article/details/70755892 续上一篇的文章:微信小程序之商品属性分类 —— 微信小程序实战商城 ...
- 微信小程序的开发——01小程序的执行流程是怎样的?
作者:叶小钗 转载至:https://www.cnblogs.com/yexiaochai/p/9346043.html 我们这边最近一直在做基础服务,这一切都是为了完善技术体系,这里对于前端来说便是 ...
- QQ小程序开发与发布小教程
QQ小程序QQApp,和微信小程序类似,可以直接在手机QQ中直接打开,应用内应用,省去了安装手机APP,非常方便.官方的介绍:QQ小程序为QQ体系下的应用开放平台,可为不同类型的产品提供框架,并在QQ ...
- 写个小程序01 | 注册微信小程序
出于兴趣和学习目的,我想自己做一个基于"子弹笔记(Bullet Journal)"的小程序.由于个人开发经验很有限,只在课程作业中写过 web 前端,所以也不知道多久能写出来(逃) ...
- 微信小程序来了,小程序都能做些什么
2017年的微信大动作就是微信小程序了,到底小程序都能做些什么?这是很多人关注的热点,小程序开发对企业又有什么帮助呢?下面让厦门微信小程序开发公司来为你就分析下. 微信小程序与APP的关系 ...
随机推荐
- Vue2 实现树形菜单(多级菜单)功能模块
结构示意图 ├── index.html ├── main.js ├── router │ └── index.js # 路由配置文件 ├── components # 组件目录 │ ├── App. ...
- iOS- 利用AFNetworking(AFN) - 实现文件断点下载
https://www.cnblogs.com/qingche/p/3500746.html 1. 定义一个全局的AFHttpClient:包含有 1> baseURL 2> 请求 3&g ...
- [2017BUAA软工助教]第0次作业小结
BUAA软工第0次作业小结 零.题目 作业链接: This is a hyperlink 一.评分规则 本次作业满分10分: 按时提交有分 一周内补交得0分 超过一周不交或抄袭倒扣全部分数 评分规则如 ...
- java kill thread command line
multithreading - How do you kill a Thread in Java? - Stack Overflowhttps://stackoverflow.com/questio ...
- React Native之通知栏消息提示(android)
React Native之通知栏消息提示(android) 一,需求分析与概述 1.1,推送作为手机应用的基本功能,是手机应用的重要部分,如果自己实现一套推送系统费时费力,所以大部分的应用都会选择使用 ...
- HTML5经典实例——1基础语法和语义
1指定DOCTYPE 在页面的最开始处指定HTML5 DOCTYPE DOCTYPE是不区分大小写的.可以任意的使用大小写. <!DOCTYPE html> <html lang=& ...
- Swagger2常用注解及其说明 (转)
Api 用在Controller中,标记一个Controller作为swagger的文档资源 属性名称 说明 value Controller的注解 description 对api资源的描述 hid ...
- 进程有一个全局变量i,还有有两个线程。i++在两个线程里边分别执行100次,能得到的最大值和最小值分别是多少?
转自https://blog.csdn.net/biubiu741/article/details/77990592 i++不是原子操作,也就是说,它不是单独一条指令,而是3条指令: 1.从内存中把i ...
- SLAs-笔记
类型 sla status determined at time intervals over a timeline: average transaction response time errors ...
- 关于 flask 实现数据库迁移以后 如何根据创建的模型类添加新的表?
在此之前 我们先说一下常规的flask运用第三方扩展来实现数据库的迁移的三个步骤以及每步的目的. 数据库的迁移的三个步骤:(cd 到run.py所在路径) python run.py db init ...