当前位置: 首页 > news >正文

C++格式化库fmt使用方法

1. 格式化库fmt简介

fmt github地址
api说明
格式化参数说明

内容的格式化,体现在代码中主要表现为字符串、基本类型、自定义类型的拼接。例如说打印日志、拼接变量等。C++中我们会经常使用类似printf,snprintf(C风格使用不方便),std::string.append(繁琐), std::iostream(慢)这些来实现格式化。
fmt库是C++语法开发的格式化库,被诸多项目使用。相比于printf,stream主要兼具以下几个优点:

  1. 速度更快,更安全
  2. 支持位置参数
  3. 支持自定义对象的格式化
  4. python风格,更简洁

2. fmt的基本使用

fmt库是python风格的格式化库,语法被{}包裹起来。语法总体上分为两段 {id:format}, id是位置参数或者命名参数,format是具体的格式化说明,包括对齐、宽度、精度、填充等。详细语法说明可以参考: syntax

2.1 基本替换

  • 基本替换
fmt::format("id={},cost={}ms,ret={}", "5d84f51115d6f0d69dc299d280a016a4", 30.0, 0);
// id=5d84f51115d6f0d69dc299d280a016a4,cost=30ms,ret=0
  • 带位置参数的替换
fmt::print("I'd rather be {1} than {0}.\n", "right", "happy");
// I'd rather be happy than right.

2.2 参数格式化

format_spec ::=  [[fill]align][sign]["#"]["0"][width]["." precision]["L"][type]
fill        ::=  <a character other than '{' or '}'>
align       ::=  "<" | ">" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer | "{" [arg_id] "}"
precision   ::=  integer | "{" [arg_id] "}"
type        ::=  "a" | "A" | "b" | "B" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" |"o" | "p" | "s" | "x" | "X" | "?"
  • 格式化时间和日期
 auto now = std::chrono::system_clock::now();fmt::print("Date and time: {}\n", now);fmt::print("Time: {:%H:%M}\n", now);
  • 格式化STL
  std::vector<int> v = {1, 2, 3};fmt::print("{::#b}\n", v);// [0b1, 0b10, 0b11] 转换成2进制std::map<std::string, std::string> kv{{"k1", "v1"}};fmt::print("{}", kv);// {"k1": "v1"}
  • 对齐、填充、精度、宽度
    例如我要将cost值格式化为小数点后保留3位,总长度为8,不足地方在左侧使用0填充。
    参照上面的语法,fill=0, align=>(选择左对齐),width=8,precision=3,type=f
    fmt::print("cost={0:0>08.3f}\n", 1.2);
  • 整数进制
    例如需要将请求id转换成16进制,固定长度为8位。
    fmt::print("id={:08x}\n", 12567);

2.3 命名参数

使用fmt::arg

  std::string ret = "ret:";fmt::format_to(std::back_inserter(ret), "id={}", "123");fmt::print("named {ret:}", fmt::arg("ret", ret));

2.4 自定义类型的格式化

实际使用过程中,服务中可能存在一些复杂的结构体,我们希望在日志中打印出该结构体的一些信息便于追踪。例如我们有一个这样的结构体,表示后端服务在处理请求时的一个记录。

struct ServiceContext {std::string ip;float cost;int ret;int id;std::string ToString() const {return fmt::format("[{:08x}] client={}, cost={:.2f}", id, ip, cost);}
};

在打印记录的时候我们需要获取该结构体的一些具体信息,通常我们可能会写一个ToString() 或者DebugString()的接口,返回具体的信息。但是有时我们不能直接修改这些结构,也可以在fmt库中位该类型定义format_as接口.

std::string format_as(const ServiceContext &ctx) { return fmt::format("[{:08x}] client={}, cost={:.2f}", ctx.id, ctx.ip, ctx.cost);
}

当然,fmt库也支持为自定义类型定义各种语法,不再深入讨论。

相关文章:

C++格式化库fmt使用方法

1. 格式化库fmt简介 fmt github地址 api说明 格式化参数说明 内容的格式化&#xff0c;体现在代码中主要表现为字符串、基本类型、自定义类型的拼接。例如说打印日志、拼接变量等。C中我们会经常使用类似printf,snprintf(C风格使用不方便),std::string.append(繁琐), std::io…...

HTML 颜色名:网页设计的调色板

HTML 颜色名:网页设计的调色板 在网页设计和开发中,颜色是一个关键元素,它不仅影响视觉效果,还能传达情感和品牌信息。HTML 颜色名是用于在 HTML 和 CSS 代码中指定颜色的预定义名称。这些颜色名易于记忆,方便设计师和开发者快速选择和应用颜色。本文将详细介绍 HTML 颜色…...

12306 火车票价格解析 (PHP 解析)

1. 从接口拿数据 日期 出发站 终点站 都填上 xxx/otn/leftTicketPrice/queryAllPublicPrice?leftTicketDTO.train_date2024-06-15&leftTicketDTO.from_stationBJP&leftTicketDTO.to_stationSJP&purpose_codesADULT 返回的数据是这样的 {"validateMess…...

了解统计学中不同类型的分布

目录 一、说明 二、均匀分布&#xff1a; 三、机器学习和数据科学中的均匀分布示例&#xff1a; 3.1 对数正态分布&#xff1a; 3.2 机器学习和数据科学中的对数正态分布示例&#xff1a; 四、 帕累托分布 4.1 什么是幂律&#xff1f; 4.2 机器学习和数据科学中的帕累托分布示例…...

k8s-CCE创建工作负载变量引用

CCE创建工作负载变量引用 背景&#xff0c;看到cce创建负载时会生成变量&#xff0c;如下。在skywaking-agent的使用&#xff0c;想要调用cce负载变量生成service_name。 -Dskywalking.agent.authentication里含有敏感信息需要写到配置项。简单粗糙的都写到配置项好像不合适。…...

后端主流框架--Spring02

前言:上篇关于Spring的文章介绍了一些Spring的基本知识&#xff0c;此篇文章主要分享一下如何配置Spring环境&#xff0c;如何注入等。 Spring项目构建 导入Spring相关JAR包 <dependency><groupId>org.springframework</groupId><artifactId>spring…...

[数据集][目标检测]减速带检测数据集VOC+YOLO格式5400张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5400 标注数量(xml文件个数)&#xff1a;5400 标注数量(txt文件个数)&#xff1a;5400 标注…...

分析Linux操作指令及使用场景与频率分析 持续更新

本篇主要针对在日常工作与学习中使用较多的linux指令的使用方法以及使用频次进行分析与讲解&#xff0c;旨在能够更好的掌握这些必备的技能。 linux指令非常的多&#xff0c;如果要记住所有的指令使用方法是非常困难的且要花费很长的时间&#xff0c;很多人习惯离开使用去通篇…...

Redis 字符串(String)

Redis 字符串(String) 介绍 Redis是一种开源的、高性能的键值数据库,它支持多种类型的数据结构,其中字符串(String)是Redis中最基本的数据类型之一。字符串类型可以存储任何形式的字符串,包括文本、序列化的对象或二进制数据。在Redis中,字符串类型的最大容量为512MB。 …...

第一篇:容器化的未来:从Docker的革命到云原生架构

容器化的未来&#xff1a;从Docker的革命到云原生架构 1. 引言 在当今快速演进的技术领域&#xff0c;容器化技术已经成为云计算和微服务架构的重要组成部分。该技术以其高效的资源利用率、快速的部署能力和卓越的隔离性能&#xff0c;彻底改变了软件开发和部署的方式。容器化…...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] URL拼接(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 URL拼接(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解…...

反射,枚举以及lambda表达式

【本节目标】 1. 掌握反射 2. 掌握枚举 3. 掌握lambda表达式使用 反射 1 定义 Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调…...

DNS域名解析----分离解析、多域名解析、父域与子域

1 理论部分 1.1 分离解析 DNS的分离解析&#xff0c;是指根据不同的客户端提供不同的域名解析记录。来自不同地址的客户机请求解析同一域名时&#xff0c;为其提供不同的解析结果。也就是内外网客户请求访问相同的域名时&#xff0c;能解析出不同的IP地址&#xff0c;实现负载…...

Spring底层架构核心概念解析

BeanDefinition BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点.比如: beanClass:表示Bean类型scope:表示Bean作用域,单例/原型等lazyInit:表示Bean是否懒加载initMethodName:表示Bean初始化时要执行的方法destoryMethodName:表示Bean销毁时…...

C++ 44 之 指针运算符的重载

#include <iostream> #include <string> using namespace std;class Students04{ public:int m_age;Students04(int age){this->m_age age;}void showAge(){cout << "年龄是&#xff1a; " << this->m_age << endl;}~Students0…...

onlyoffice在线预览加载优化

背景&#xff1a; 使用容器部署onlyoffice到linux服务器&#xff0c;使用内网访问速度还可以接受&#xff0c;但是如果放到外网路径访问起来&#xff0c;速度就会很慢&#xff0c;甚至加载失败&#xff1b; 优化方案&#xff1a; 预览的过程排除网络因素&#xff0c;可以发现打…...

依赖自动装配

黑马程序员SSM框架 文章目录 1、依赖自动装配2、依赖自动装配的特征 1、依赖自动装配 IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配自动装配方式 按类型&#xff08;常用&#xff09;按名称按构造方法不启用自动装配 配置中使用bean标签auto…...

mysql和redis的双写一致性问题

一&#xff0c;使用方案 在使用redis作为缓存的场景下&#xff0c;我们一般使用流程如下 二&#xff0c;更新数据场景 我们此时修改个某条数据&#xff0c;如何保证mysql数据库和redis缓存中的数据一致呢&#xff1f; 按照常规思路有四种办法&#xff0c;1.先更新mysql数据&a…...

Qwen2——阿里巴巴最新的多语言模型挑战 Llama 3 等 SOTA

引言 经过几个月的期待&#xff0c; 阿里巴巴 Qwen 团队终于发布了 Qwen2 – 他们强大的语言模型系列的下一代发展。 Qwen2 代表了一次重大飞跃&#xff0c;拥有尖端的进步&#xff0c;有可能将其定位为 Meta 著名的最佳替代品 骆驼3 模型。在本次技术深入探讨中&#xff0c;我…...

等级考试3-2021年3月题

作业&#xff1a; #include <iostream> using namespace std; int chonghe(int,int,int,int); int main(){int a[1000],b[1000];int n,ma0;cin>>n;for(int i0;i<n;i){cin>>a[i]>>b[i];}for(int i0;i<n;i){for(int ji1;j<n;j){mamax(ma,chongh…...

Web前端开发PPT:深入探索与实战应用

Web前端开发PPT&#xff1a;深入探索与实战应用 在数字化时代&#xff0c;Web前端开发已成为构建丰富、交互性强的网页应用的关键环节。本次分享旨在通过PPT的形式&#xff0c;带领大家深入探索Web前端开发的精髓&#xff0c;并分享一些实战应用的经验。接下来&#xff0c;我们…...

liunx常见指令

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 二、安装环境 1.租借服务器 2.下载安装 XShell 3.使用xshll登录服务器 三、Linux基础命令 一、文件和命令 ​编辑1、cd 命令 2、pwd 命令 3、ls 命令 4、cp 命令 …...

vscode设置成中文界面

在Visual Studio Code&#xff08;VSCode&#xff09;中设置中文界面&#xff0c;你可以采用以下几种方法&#xff0c;以下是详细步骤&#xff1a; 方法一&#xff1a;通过设置菜单设置中文 打开VSCode&#xff1a;首先&#xff0c;确保你已经打开了VSCode软件。进入设置&…...

python命名空间详解

Python中的命名空间是编程语言设计的一个核心概念&#xff0c;它负责存储变量名与其对应的值之间的映射关系&#xff0c;确保了程序中变量的唯一性和可访问性。命名空间不仅关乎变量的生命周期和作用范围&#xff0c;也是Python中实现封装、避免命名冲突的重要机制。 1. 命名空…...

【日常记录】【vue】vite-plugin-inspect 插件的使用

文章目录 1、vite-plugin-inspect2、安装3、使用4、链接 1、vite-plugin-inspect vite-plugin-inspect 可以让开发者在浏览器端就可以看到vue文件编译后的代码、vue文件的相互依赖关系 2、安装 npm i -D vite-plugin-inspect// vite.config.ts import Inspect from vite-plugi…...

mini web框架示例

web框架&#xff1a; 使用web框架专门负责处理用户的动态资源请求&#xff0c;这个web框架其实就是一个为web服务器提供服务的应用程序 什么是路由&#xff1f; 路由就是请求的url到处理函数的映射&#xff0c;也就是说提前把请求的URL和处理函数关联好 管理路由可以使用一个…...

基于C#开发web网页管理系统模板流程-主界面统计功能完善

点击返回目录-> 基于C#开发web网页管理系统模板流程-总集篇-CSDN博客 前言 紧接上篇->基于C#开发web网页管理系统模板流程-主界面管理员入库和出库功能完善_c#web程序设计-CSDN博客 统计功能是管理系统很常见的功能&#xff0c;例如仓库管理系统要统计某时间段的出入库以…...

chromedriver114以后版本下载地址汇总chromedriver所有版本下载地址汇总国内源下载

谷歌浏览器版本经常会升级&#xff0c;chromedriver 也得下载匹配的版本 chromedriver 114以前版本下载地址https://registry.npmmirror.com/binary.html?pathchromedriver/ 但是自从115版本及其以后网站就找不到了&#xff0c;因此整理了截止2024年6月16日前所有在windows x6…...

x86计算机的启动初期流程 Linux 启动流程

x86计算机的启动初期流程 CPU&#xff1a; step1&#xff0c;加点开机&#xff0c;cpu自己初始化 step2&#xff0c;cpu 从物理地址 0xFFFFFFF0h 取指令执行&#xff1b;此处存放BIOS代码&#xff0c;这些代码可以是由主板自动从 EEPROM中拷贝至此内存地址处&#xff1b;即下…...

P450Rdb: CYP450数据库--地表最强系列--文献精读24

P450Rdb: A manually curated database of reactions catalyzed by cytochrome P450 enzymes P450Rdb: 一个人工整理的细胞色素P450酶催化反应数据库 http://www.cellknowledge.com.cn/p450rdb/ 还有一篇类似CYP450综述-20年-地表最强系列-文献精读-4 要点&#xff1a; P450…...

osx wordpress/优化关键词技巧

2019独角兽企业重金招聘Python工程师标准>>> 一年一度的秋招已经打响了发令枪&#xff0c;从去年的薪酬排行来看&#xff0c;算法工程师和数据分析等工作排在前列&#xff0c;很多相关专业的学生一直在自学一些网络上的公开课并阅读一些专业书籍&#xff0c;比如“西…...

wordpress 访问限制/域名批量查询工具

下面有这样一个场景&#xff1a; 数据库的某些字段是自增产生的&#xff08;比如说mysql&#xff0c;他就有自增的功能&#xff09; 我在插入数据的时候就没插入自增的那一段数据&#xff0c;但在插入数据后&#xff0c;我想看看自增的这条数据是什么&#xff08;回写操作&…...

台州路桥网站建设/常用的seo工具

之前遇到过"/",在esclipse中报错&#xff0c;只认识“//”&#xff0c;“\”符号&#xff0c;需要将string字符串“/”&#xff0c;转换成“//”或者“\”怎么转呢&#xff1f; 获取字符串是 String path "/root/data/image"; StringBuilder sb new Stri…...

wordpress h1标签/免费平台

文章目录散列查找1. 基本思想2. 基本工作3. 散列函数的构造1. 考虑因素2. 数字关键词1. 直接定址法2. 除留余数法3. 数字分析法4. 折叠法5. 平方取中法3. 字符串关键字1. ASCII码加和法2. 前3个字符移位法3. 移位法4. 冲突处理方法1. 常用策略2. 开放定址法1. 线性探测2. 平方探…...

网站规划结构/嘉兴网站建设

a便签作为锚点定位页面的位置还是很常见的&#xff0c;基本实现如下&#xff1a; <a href"#person_card" >个人</a> <a href"#company_card" >企业</a><div id"person_card">个人内容</div> <div id&qu…...

好看的网站设计/武汉电脑培训学校有哪些

1.固定分配局部置换 系统为每个进程分配一定数量的物理块&#xff0c;在整个运行期间都不改变。若进程在运行中发生缺页&#xff0c;则只能从该进程在内存中的页面中选出一页换出&#xff0c;然后再调入需要的页面。这种策略的缺点是:很难在刚开始就确定应为每个进程分配多少个…...