功能作用
可输出启动参数、环境变量、文件属性。
可进行彩色输出。
用于显示程序运行情况。
涉及知识点
#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;
}
参考资料
\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 清除从光标到行尾的内容
- 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)