wiseluster实验室吧 关注:30贴子:2,334
  • 6回复贴,共1

控制台++ v1.7.0 正式版附教程

只看楼主收藏回复

// 控制台++(Console++)
// C++14 版本,适用于 Linux/Android 控制台
// 文件名:console
// 版本:1.7.0 [Build 20141217]
// 作者:Wiseluster
// 百度贴吧:@PhoenixSystems @不一样的井猜 @OtotheLCHN
// 注意:使用 C4droid G++ 编译器编译时需要参数 -std=c++14
// 更新日志:
// [版本 1.7.0]
// 1. wlang::console.showtime() 函数中的 std::flush 控制符更改为 std::endl 控制符
// 2. wlang::console.showtime() 函数更改为 wlang::console.time() 函数
// 3. 微调 wlang::console.pause()、wlang::console.time() 和 wlang::console.udelay() 函数
// [版本 1.6.0]
// 1. 更改 wlang::console 对象类型为常量匿名类
// 2. 更改 wlang::console 对象成员函数返回类型为 auto & 并加上 const 后置限定符
// 3. 去除不必要的输入功能和部分输出功能(wlang::console.put() 和 wlang::console.write() 函数)
// 4. wlang::console.putline() 函数更改为 wlang::console.echo() 函数
// 5. 增加 wlang::console.pause() 函数(原理来自 conio.h,稍作修改)
// [版本 1.5.0]
// 1. 更正 wlang::console.read() 函数错误
// 2. 更正预处理指令错误
// [版本 1.4.0]
// 1. 正式更改名称为 Console++
// 2. 丢弃不必要的后置类型声明(-> decltype (*this))
// 3. 增加 wlang::console.put() 和 wlang::console.putline() 刷新缓冲区功能
// [版本 1.3.0]
// 1. 增加标准输入输出功能
// 2. 更改文件名为 console
// [版本 1.2.0]
// 1. 更正光标移动函数错误
// 2. 更正预处理指令错误
// [版本 1.1.0]
// 1. 使用名称空间 wlang
// 2. 原 C 版头文件中的所有函数定义和常量成为 wlang::console 匿名类对象成员,且成员函数可拼接
// 3. 字体格式常量使用小写


来自Android客户端1楼2014-12-17 22:10回复
    #ifndef __CONSOLE__PLUSPLUS__
    #define __CONSOLE__PLUSPLUS__ 20141217
    #include <iostream>
    #include <sstream>
    #include <ctime>
    #include <termios.h>
    namespace wlang
    {
    const class
    {
    private:
    // 星期一到日的 std::string 字符串数组
    const std::string week_days[7] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
    // 私有字体类定义
    class font
    {
    private:
    unsigned fontcode;
    public:
    font() : fontcode(0) {}
    explicit font(unsigned u) : fontcode(u) {}
    explicit operator unsigned() const
    {
    return fontcode;
    }
    bool operator==(const font & ft) const
    {
    return fontcode == ft.fontcode;
    }
    bool operator!=(const font & ft) const
    {
    return fontcode != ft.fontcode;
    }
    bool operator<(const font & ft) const
    {
    return fontcode < ft.fontcode;
    }
    bool operator>(const font & ft) const
    {
    return fontcode > ft.fontcode;
    }
    };
    public:
    // 字体特殊格式常量对象
    const font bold = font(1), nobold = font(22), underline = font(4), nounderline = font(24);
    // 字体前后景颜色常量对象
    const font black = font(30), red = font(31), green = font(32), brown = font(33), blue = font(34), purple = font(35), navy = font(36), white = font(37), original_underline = font(38), original = font(39);
    // 设置控制台字体特殊格式
    auto & format(const font & fmt) const
    {
    if (fmt != bold && fmt != nobold && fmt != underline && fmt != nounderline)
    std::cerr << "wlang::console.format() 函数调用错误:参数无效。" <<
    std::endl;
    else
    std::cout << "\e[" << unsigned(fmt) << "m";
    return *this;
    }
    // 设置控制台字体前后景颜色
    auto & color(const font & front, const font & back) const
    {
    if (front < black || front > original || back < black || back > original)
    std::cerr << "wlang::console.color() 函数调用错误:参数无效。" <<
    std::endl;
    else if (back == original_underline)
    std::cerr << "wlang::console.color() 函数调用错误:字体格式 original_underline 必须是前景。" << std::endl;
    else
    std::cout << "\e[" << unsigned(front) << ";" << unsigned(back) + 10
    << "m";
    return *this;
    }
    // 恢复控制台字体格式默认设置
    auto & reset() const
    {
    std::cout << "\e[0m";
    return *this;
    }
    // 清空屏幕内容
    auto & clear() const
    {
    std::cout << "\e[2J\e[1;1H";
    return *this;
    }
    // 移动光标到指定位置
    auto & move(unsigned x, unsigned y) const
    {
    std::cout << "\e[" << y << ";" << x << "H";
    return *this;
    }
    // 暂停(请按任意键继续)
    auto & pause() const
    {
    std::cout << "请按任意键继续……" << std::endl;
    termios oldt, newt;
    tcgetattr(0, &oldt);
    newt = oldt;
    newt.c_lflag &= ~ICANON;
    newt.c_lflag &= ~ECHO;
    tcsetattr(0, TCSANOW, &newt);
    std::cin.get();
    newt.c_lflag |= ICANON;
    newt.c_lflag |= ECHO;
    return *this;
    }
    // 以秒为单位暂停一段时间
    auto & delay(unsigned s) const
    {
    clock_t wait = s * CLOCKS_PER_SEC;
    clock_t start = clock();
    while (clock() - start < wait);
    return *this;
    }
    // 以微秒或 clock 为单位暂停一段时间
    auto & udelay(unsigned s) const
    {
    clock_t start = clock();
    while (clock() - start < s);
    return *this;
    }
    // 显示系统当前时间
    auto & time() const
    {
    std::time_t t;
    std::time(&t);
    std::tm * tn = std::localtime(&t);
    std::cout << tn->tm_year + 1900 << " 年 "
    << tn->tm_mon + 1 << " 月 "
    << tn->tm_mday << " 日 "
    << week_days[tn->tm_wday] << " "
    << ((tn->tm_hour >= 10) ? "" : "0") << tn->tm_hour << ":"
    << ((tn->tm_min >= 10) ? "" : "0") << tn->tm_min << ":"
    << ((tn->tm_sec >= 10) ? "" : "0") << tn->tm_sec << std::endl;
    return *this;
    }
    // 刷新缓冲区
    auto & flush() const
    {
    std::cout << std::flush;
    return *this;
    }
    // 向控制台放置换行符
    auto & echo() const
    {
    std::cout << std::endl;
    return *this;
    }
    // 向控制台放置数据,并在最后放置换行符
    template <typename T>
    auto & echo(const T & t) const
    {
    std::cout << t;
    echo();
    return *this;
    }
    // 向控制台放置数据,并在最后放置换行符(可变长参数列表)
    template <typename T, typename... Args>
    auto & echo(const T & t, const Args &... args) const
    {
    std::cout << t;
    echo(args...);
    return *this;
    }
    } console;
    }
    #endif


    来自Android客户端2楼2014-12-17 22:11
    回复
      教程开始。


      来自Android客户端3楼2014-12-17 22:12
      收起回复


        来自Android客户端4楼2014-12-18 09:47
        收起回复