控制台输出彩色基础信息

7 篇文章 0 订阅
4 篇文章 0 订阅

功能作用

可输出启动参数、环境变量、文件属性。
可进行彩色输出。
用于显示程序运行情况。

涉及知识点

  • #defind 的使用,字符串和数字的拼接。
  • 彩色控制台输出代码及简化。
  • 文件信息的读取
  • 获取当前时间
  • 时间转字符串

完整代码

Windows 下使用 VS Code 在 minggw 终端下进行的代码编写,未考虑兼容性。

HelloWorld.cpp :

#include <iostream>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifndef WIN32
#include <unistd.h>
#else
#define stat _stat
#endif

using namespace std;

namespace FILE_INFO_UTILS{
    class FileInfoUtils{
    public:
        FileInfoUtils(char*filepath) : m_filePath(filepath) {
            _stat64(filepath, &m_stat);
        }
        const struct _stat64 stat() const { return m_stat; }
        const std::string filePath() const { return m_filePath; }
        // std::string fileName() { return m_filePath; }
        // std::string fileSuffix() { return m_filePath; }
        // std::string dirName() { return m_filePath; }
        // std::string mode() { return std::string("-rwxrwxrwx"); }
        const __int64 fileSize() const { return m_stat.st_size; }  // win(1024)/mac(1000)
        // const std::string humanSize() const { return std::string("xxx bytes/KB/MB/GB/TB/PB/..."); }
        const std::string modifyTime() { return timeToStr(m_stat.st_mtime); }
        const std::string createTime() { return timeToStr(m_stat.st_ctime);; }
        const std::string activeTime() { return timeToStr(m_stat.st_atime);; }
    private:
        std::string timeToStr(const __time64_t time) {
            struct tm tmStruct = {};
            char timeChar[26] = {};
            localtime_s(&tmStruct, &time);
            strftime(timeChar, sizeof(timeChar), "%Y-%m-%d %H:%M:%S", &tmStruct);
            return timeChar;
        }
    private:
        std::string m_filePath;
        struct _stat64 m_stat;
    };
}

namespace COLOR_TEXT{
#define COLOR_TEXT_FOREGROUND(red, green, blue) "\x1b[38;2;" #red ";" #green ";" #blue "m"
#define COLOR_TEXT_BACKGROUND(red, green, blue) "\x1b[48;2;" #red ";" #green ";" #blue "m"
#define COLOR_TEXT_BOLT           "\033[1m"  // 加粗
#define COLOR_TEXT_BOLTOFF        "\033[22m" // 关闭加粗
#define COLOR_TEXT_ITALICS        "\033[3m"  // 斜体
#define COLOR_TEXT_TTALICSOFF     "\033[23m" // 关闭斜体
#define COLOR_TEXT_UNDERLINE      "\033[4m"  // 下划线
#define COLOR_TEXT_UNDERLINEOFF   "\033[24m" // 关闭下划线
#define COLOR_TEXT_INVERT         "\033[7m"  // 反色/反转?
#define COLOR_TEXT_INVERTOFF      "\033[27m" // 关闭反色/反转?
#define COLOR_TEXT_FLASH          "\033[5m"  // 闪烁 // 未看到效果
#define COLOR_TEXT_HIDE           "\033[8m"  // 消隐 // 空选及选中均不显示,但可复制粘贴
#define COLOR_TEXT_RESET          "\033[0m"  // 重置

#ifdef COLOR_TEXT_SIMPLE
#define CTF(red, green, blue)   COLOR_TEXT_FOREGROUND(red, green, blue)
#define CTB(red, green, blue)   COLOR_TEXT_BACKGROUND(red, green, blue)
#define CTBO                    COLOR_TEXT_BOLT
#define CTIT                    COLOR_TEXT_ITALICS
#define CTUN                    COLOR_TEXT_UNDERLINE
#define CTI                     COLOR_TEXT_INVERT
#define CTFL                    COLOR_TEXT_FLASH
#define CTH                     COLOR_TEXT_HIDE
#define CTR                     COLOR_TEXT_RESET
#endif // COLOR_TEXT_SIMPLE

#ifdef DEBUG
    void test() {
        std::cout << "\x1b[38;2;255;0;0m\x1b[38;2;100;0;100m COLOR TEXT \033[0m" << std::endl;
        std::cout << COLOR_TEXT_FOREGROUND(255, 0, 0) << COLOR_TEXT_BACKGROUND(100, 0, 100)
            << " COLOR TEXT " << COLOR_TEXT_RESET << std::endl;
#define COLOR_TEXT_SIMPLE
        cout << CTF(255, 0, 0) << CTB(100, 0, 100) << " COLOR TEXT " << CTR << endl;
#undef COLOR_TEXT_SIMPLE
    // cout << "\033[1m 设置高亮度 \033[0m ==== \033[4m 下划线 \033[0m ==== \033[5m 闪烁 \033[0m ==== \033[7m 反显 \033[0m ==== \033[8m 消隐 \033[0m ====" << endl;
    }
#endif // DEBUG
}

int main(int argc, char*argv[], char*envp[]) {
    cout << "Hello World!" << endl;

#define CK(string_key)   COLOR_TEXT_FOREGROUND(100, 0, 0) COLOR_TEXT_BOLT         string_key    COLOR_TEXT_RESET
#define CV(value)        COLOR_TEXT_FOREGROUND(100, 0, 0) COLOR_TEXT_UNDERLINE << value << COLOR_TEXT_RESET
#define CKV(string_key)  std::cout << CK(#string_key) << " : " << CV(string_key) << std::endl;

	// 输出基础宏定义
    CKV(__FILE__);
    CKV(__LINE__);
    CKV(__DATE__);
    CKV(__TIME__);
    CKV(__TIMESTAMP__);  // 源文件最后修改时间

    // 输出程序路径    // 输出启动参数
    CKV(argc);
    for(int i = 0; i < argc; ++i) {
        cout << CK("argv") << "[" << CV(i) << "/" << CV(argc) << "]" << CV(argv[i]) << endl;
    }

    // 输出文件时间
    FILE_INFO_UTILS::FileInfoUtils fiu(argv[0]);
    cout << CK("file active time") << " : " << CV(fiu.activeTime()) << endl;
    cout << CK("file create time") << " : " << CV(fiu.createTime()) << endl;
    cout << CK("file modify time") << " : " << CV(fiu.modifyTime()) << endl;

    // 输出当前时间
    time_t _Time;
    time(&_Time);
    struct tm tmStruct = {};
    char timeChar[26] = {};
    localtime_s(&tmStruct, &_Time);
    strftime(timeChar, sizeof(timeChar), "%Y-%m-%d %H:%M:%S", &tmStruct);
    cout << CK("current time") << " : " << CV(timeChar) << endl;

    // 输出环境变量
    int envp_count = 0;
    while(envp[envp_count] != NULL) { ++envp_count; }
    cout << CK("envp count") << " : " << CV(envp_count) << endl;
    for (int i = 0; envp[i] != NULL; i++) {
        cout << CK("envp") << "[" << CV(i) << "/" << CV(envp_count) << "]" << CV(envp[i]) << endl;
    }
    return EXIT_SUCCESS;
}

参考资料

关于C++语言如何改变字体输出颜色

\x1b[38;2;%d;%d;%d 自定义前景色
\x1b[48;2;%d;%d;%d 自定义背景色
wprintf(L"\x1b[38;2;%d;%d;%d\x1b[48;2;%d;%d;%dmHello,World!",r2,g2,b2,r1,g1,b1);

【伸手党福利】console.log()修改字体大小、颜色、背景【基础+进阶总结】
使Node.js中的console.log()输出彩色字体

\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n列
\033[nD 光标左移n列
\033[y;xH 设置光标位置(y列x行)
\033[2J 清屏
\033[K 清除从光标到行尾的内容

kamito/console-color

  • forgeround color
    BLACK => “\033[30m”,
    RED => “\033[31m”,
    GREEN => “\033[32m”,
    YELLOW => “\033[33m”,
    BLUE => “\033[34m”,
    PURPLE => “\033[35m”,
    CYAN => “\033[36m”,
    WHITE => “\033[37m”,
  • background color
    BLACKB => “\033[40m”,
    REDB => “\033[41m”,
    GREENB => “\033[42m”,
    YELLOWB => “\033[43m”,
    BLUEB => “\033[44m”,
    PURPLEB => “\033[45m”,
    CYANB => “\033[46m”,
    WHITEB => “\033[47m”,
  • bold
    B => “\033[1m”,
    BOFF => “\033[22m”,
  • italics
    I => “\033[3m”,
    IOFF => “\033[23m”,
  • underline
    U => “\033[4m”,
    UOFF => “\033[24m”,
  • invert
    R => “\033[7m”,
    ROFF => “\033[27m”,
  • reset
    RESET => “\033[0m”,

CMake 编译

CMakeLists.txt

# cmake -B build -S . -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug
# cmake --build build
# ./build/HelloWorld.exe

cmake_minimum_required(VERSION 3.28)

project(HelloWorld)

set(CXX_STANDARD 11)
set(CXX_STANDARD_REQUIRED ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# set(CMAKE_AUTOMOC ON) # No valid Qt version found ... AUTOMOC disabled...

set(CMAKE_BUILD_TYPE "Debug")
# 条件判断
if(CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -O0")
    message("Debug mode:${CMAKE_C_FLAGS_DEBUG}")
elseif(CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wall -O3")
    message("Release mode:${CMAKE_C_FLAGS_RELEASE}")
else()
    message("else:${CMAKE_BUILD_TYPE}")
    message("else:${CMAKE_C_FLAGS_RELEASE}")
endif()

add_executable(HelloWorld HelloWorld.cpp)

运行效果

运行结果示意

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值