【C/C++】手搓项目中常用小工具:日志、sqlit数据库、Split切割、UUID唯一标识
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”
绪论:
本章将写到一些手搓常用工具,方便在项目中的使用,并且在手搓的过程中一些函数如:日志 宏中的__VA_ARGS__接收可变参、SQLlit数据库的C语言接口、Split中string的使用,以及UUID中随机数的生成和数据范围的限制,全文10000字包含实现细节 和 源码 开始学习吧。后续还将持续更新,敬请期待!
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。
1. 日志打印工具
创建命名空间 mq;在mqdemo下创建log/log.cpp
封装一个日志的宏,通过这个宏打印,带上
- 时间-
- 文件名-
- 行号
- [12:21:22][文件名:行号]打开失败
- 文件名的宏:FILE、行号的宏:LINE
获取时间的函数 :
头文件:#include size_t strftime(char *s, size_t max, const char *format, const struct tm *tm); 参数: 1. s:输出型参数,最终返回的时间放在此处 2. maxsize:最大的长度 3. format:时间格式(年月日 时分秒结构:"%H%M%S") 4. tm:当前的时间结构 localtime: 一般要配合localtime函数来生成tm结构体(该结构体事用于生成所需的时间结构的结构体) struct tm *localtime(const time_t *timep); struct tm { int tm_sec; /* seconds */ int tm_min; /* minutes */ int tm_hour; /* hours */ int tm_mday; /* day of the month */ int tm_mon; /* month */ int tm_year; /* year */ int tm_wday; /* day of the week */ int tm_yday; /* day in the year */ int tm_isdst; /* daylight saving time */ }; 其中localtime还需配合time函数 头文件:#include time_t time(time_t *t); 得到time_t 的变量,当成localtime函数的参数,最终返回获取tm结构体
实现流程:
- 获取time_t当前系统时间
- 获取tm系统时间结构
- 创建一个存放数据的缓冲区(第一个参数s)
- 使用strftime函数进行获取格式化时间
- 打印查看(Debug)
- 定义宏
- 日志等级宏:
- DBG_LEVEL 0
- INF_LEVEL 1
- ERR_LEVEL 2
- DEFAULT_LEVEL DBG_LEVEL
- LOG宏
再定义三种日志打印宏来真正给外部用户使用:
- DLOG:内部调用 LOG("DEBUG","DBG_LEVEL",format,##__VA_ARGS__ )
- LOGE:…
- ELOG:…
项目操作(仿MQ)
最后将写好的日志工具放进mqcommon中logger.hpp
添加条件变量:
1.#ifndef __M_LOG_H__
2. #define __M_LOG_H__
3. #endif
日志源码
#include #include using namespace std; #define DBG_LEVEL 0 #define INF_LEVEL 1 #define ERR_LEVEL 2 #define DEFAULT_LEVEL DBG_LEVEL #define LOG(level_str,level,format, ...){\ if(level >= DEFAULT_LEVEL){\ time_t t = time(nullptr);\ struct tm* tm = localtime(&t);\ char s[1024];\ size_t size = strftime(s,1023,"%H:%M:%S",tm);\ printf("[%s][%s][%s:%d]\t" format "\n",level_str,s,__FILE__,__LINE__,##__VA_ARGS__);\ }\ }\ #define DLOG(format, ...) LOG("DEBUG",DBG_LEVEL,format, ##__VA_ARGS__) #define ILOG(format, ...) LOG("INFO",INF_LEVEL,format, ##__VA_ARGS__ ) #define ELOG(format, ...) LOG("ERROR",ERR_LEVEL,format, ##__VA_ARGS__ ) // int main() // { // // time_t t = time(nullptr);//获取系统时间 // // //为localtime创建变量 // // struct tm* tm = localtime(&t);//得到tm结构体 // // char s[1024]; // // //生成格式化时间:使用strftime // // size_t size = strftime(s,1023,"%H:%M:%S",tm);//“%H%M%S” 小时:分钟:秒,存放到s中 // // printf("[%s][%s:%d]\n",s,__FILE__,__LINE__);//[时间][文件:行数] // DLOG("DEBUG%s","aaa"); // ILOG("INFO%s","aaa"); // ELOG("ERROR%s","aaa"); // return 0; // }
2. SQLite数据库
将之间写好的sqlit代码拷贝过来(见blog)并且带上条件变量(具体看该(blog)[])
#ifndef __M_HELPER_H__ #define __M_HELPER_H__ #endif
将内部的打印改成日志模式。
SQLite数据库源码:
#include #include #include #include #include #include "loger.hpp" class SqliteHelper{ typedef int (*SqliteCallback)(void*,int,char**,char**); public: SqliteHelper(const std::string& dbfile):_dbfile(dbfile),_handler(nullptr){} //int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs ); bool open(int safe_leve = SQLITE_OPEN_FULLMUTEX)//SQLITE_OPEN_FULLMUTEX默认就为串行化模式 { int ret = sqlite3_open_v2(_dbfile.c_str(),&_handler,safe_leve | SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE,nullptr); //第一个参数是db文件路径 //第二个参数是一个输出型变量,我们将sqlite的句柄传进去,获取open后db的句柄 //第三个参数是文件打开的默认权限和方式 和 线程的安全等级 //SQLITE_OPEN_CREATE: 不存在数据库⽂件则创建 // SQLITE_OPEN_READWRITE -- 以可读可写⽅式打开数据库⽂件 //第四个参数设为空即可 if(ret != SQLITE_OK) { ELOG( "创建/打开sqlite数据库失败:%s",sqlite3_errmsg(_handler)); return false; } else{ DLOG("打开成功"); return true; } } //提前设置 SqliteCallback == int (*SqliteCallback)(void*,int,char**,char**)回调函数 bool exec(const std::string& sql,SqliteCallback cb,void* arg){ int ret = sqlite3_exec(_handler,sql.c_str(),cb,arg,nullptr); // if(ret != SQLITE_OK) { std::cout DLOG ("执行成功"); return true; } } bool close(){ sqlite3_close_v2(_handler);// return true; } private: std::string _dbfile; sqlite3 * _handler; }; //将str 通过 sep 分隔 //将结果全部存放到 result int pos = 0 , idx = 0;//pos表示要分割的字符串的首位置,idx表示分隔符的下标 while(idx idx = str.find(sep,pos); if(idx == std::string::npos){ //如果找不到就表示不需要分隔 std::string tmp_str = str.substr(pos); std::cout pos = idx + sep.length();//注意也需要往前走哈 continue; } std::string tmp_str = str.substr(pos,idx - pos); std::cout std::vector // std::cout //创建机器随机数对象 std::random_device rd; std::mt19937_64 generator(rd());//rd()仿函数生成随机数种子 std::uniform_int_distribution//循环8次生成前8byte ss ss //创建机器随机数对象 std::random_device rd; std::mt19937_64 generator(rd());//rd()仿函数生成随机数种子 std::uniform_int_distribution//循环8次生成前8byte ss ss // ss ss //分成 4 - 12 ss
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。