如何让glog输出数字时不自动补前导0,与std::cout格式一致
glog打印Eigen矩阵时数字前自动补0的适配方案
问题表现
通过glog的LOG(INFO)输出Eigen矩阵时,格式与std::cout输出不一致,测试对象sophus_R为3x3矩阵。
测试代码:
LOG(INFO) << "using glog, sophus_R is:\n" << sophus_R.matrix(); std::cout << "using std::cout, sophus_R is:\n" << sophus_R.matrix() << std::endl;
实际输出对比:
I0606 16:07:06.307516 122123 so3_test.cc:30] using glog, sophus_R is: 00000.696364 000-0.707107 00000.122788 00000.696364 00000.707107 00000.122788 000-0.173648 -2.08167e-17 00000.984808 using std::cout, sophus_R is: 0.696364 -0.707107 0.122788 0.696364 0.707107 0.122788 -0.173648 -2.08167e-17 0.984808
glog输出时会自动在数字前的空位填充'0',需要调整配置实现和std::cout一致的空格对齐效果。
根因说明
glog为了格式化日志前缀(时间戳、行号等固定宽度字段),默认给内部日志流设置了std::setfill('0')的填充规则。Eigen矩阵重载的<<运算符会直接继承当前流的格式化参数输出数值,因此会沿用glog的0填充配置,和std::cout默认的空格填充行为产生差异。
解决方法
- 单条日志修正:输出矩阵前手动将流的填充字符改为空格即可,需要提前引入
<iomanip>头文件使用格式控制符:
#include <iomanip> LOG(INFO) << "using glog, sophus_R is:\n" << std::setfill(' ') << sophus_R.matrix();
- 全局适配:如果项目所有场景都不需要0填充,可以在glog初始化逻辑中添加自定义流格式配置,将日志流默认填充字符设为空格,减少重复代码。
注:glog每条日志输出前会重置部分流状态,若全局配置不生效,优先使用单条日志指定填充字符的方案。
内容的提问来源于stack exchange,提问作者Zhang Zheng
相关产品推荐
相关产品推荐

