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;

这样写有一个局限性:在这个变量的生存周期内,不能和其它的输入方式兼容。因此有两种处理方案:

  1. 在需要getch()而不需要其它输入方式的语句块内定义临时变量。
  2. 直接像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终端有专门的转义字符。看这个博客

转载于:https://www.cnblogs.com/flashhu/p/10633928.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。下面是一些在Ubuntu编写终端界面交互式C++小程序时的一些Trick: 1. 使用ncurses库来创建终端界面。ncurses是一个用于创建文本用户界面(TUI)的库,可以让你创建菜单、窗口、文本框等控件,以及响应用户的输入。在Ubuntu下,你可以使用以下命令来安装ncurses库: ``` sudo apt-get install libncurses5-dev libncursesw5-dev ``` 2. 使用ANSI转义序列来控制终端输出。ANSI转义序列是一种特殊的字符序列,可以让你控制终端的颜色、光标位置等。例如,你可以使用以下代码来将文本输出为红色: ```c++ cout << "\033[31mHello, world!\033[0m" << endl; ``` 其中,\033[31m表示设置前景色为红色,\033[0m表示重置颜色。 3. 使用readline库来读取用户的输入。readline是一个用于读取用户输入的库,可以让你处理用户输入的历史记录、自动完成等。在Ubuntu下,你可以使用以下命令来安装readline库: ``` sudo apt-get install libreadline-dev ``` 4. 使用gnome-terminal来运行你的程序。gnome-terminalUbuntu下的一个终端模拟器,可以让你在一个新的终端窗口中运行你的程序。你可以使用以下命令来打开一个新的gnome-terminal窗口: ``` gnome-terminal -e "./your_program" ``` 其中,./your_program是你的程序的可执行文件路径。 希望这些Trick对你有所帮助!如果你有任何问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值