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的关系 ...
随机推荐
- anaconda安装win10
注意事项: 1.下载安装,双选勾勾 2.安装python3.5的版本 conda create -n tensorflow python=3.5 3.激活环境activate tensorflow 4 ...
- Django model操作
一.各种查询统计操作 def all(self) # 获取所有的数据对象 def filter(self, *args, **kwargs) # 条件查询 # 条件可以是:参数,字典,Q def ...
- node.js介绍和npm的使用
Node.js介绍 打开Nodejs英文网:https://nodejs.org/en/ 中文网:http://nodejs.cn/ 我们会发现这样一句话: 翻译成中文如下: Node.js 是一个基 ...
- 查看mysql数据库连接数、并发数相关信息
查看mysql数据库连接数.并发数相关信息. - caodongfang126的博客 - CSDN博客 https://blog.csdn.net/caodongfang126/article/det ...
- IdentityServer4【Topic】之保护APIs
Protecting APIs 保护api 默认情况下IdentityServer将access token发布成JWT(json web token)格式的. 现在,每个相关的平台都支持验证JWT令 ...
- jquery on绑定事件
描述:给一个或多个元素(当前的或未来的)的一个或多个事件绑定一个事件处理函数.(1.7版本开始支持,是 bind().live() 和 delegate() 方法的新的替代品) 语法:.on( eve ...
- Mac上通过iterm 上传文件到服务器
.安装 brew install lrzsz #这里以homebrew方式安装12.脚本 拉取 https://github.com/mmastrac/iterm2-zmodem 两个sh文件,将他们 ...
- Sqlserver 命令行方式修改 用户密码的方法
1. 之前写了一个 可以使用 ssms 的方式修改密码的情况 2. 还有办法是执行命令 exec sp_password null,'newpassword','sa' # sa 是用户名 newp ...
- HDU 2459 Maximum repetition substring
题目:Maximum repetition substring 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2459 题意:给你一个字符串,求连续重复出现 ...
- SpringBoot 中 JPA 的使用
详细连接 简书https://www.jianshu.com/p/c14640b63653 新建项目,增加依赖 在 Intellij IDEA 里面新建一个空的 SpringBoot 项目.具体步骤参 ...