boost库中的格式化输出format的使用

零、前言

格式化输出是每一个程序员经常使用到的功能,把一系列参数格式化成一个字符串,在工作中中会经常用到,C语言提供了printf这个格式化输出函数,它因简单高效而被广泛应用,对其他语言影响深远,但是它的一个缺点就是不会做类型安全检查。boost库提供了一个类似printf功能的组件boost.format,它不仅实现了printf的功能,还增加了类型安全检查和一些高级用法。

一、boost.format组件

1、boost.format组件介绍

C语言中的printf函数使用了可变参数(了解可变参使用点击)来实现被格式化的数据,但它是不安全的。boost.format组件为了增加安全性,模仿了流操作符<<,重载了二元操作符operator%作为参数输入符来实现可变参数的功能。

format组件的构造函数接受string类型作为格式化字符串,并提供了成员函数str()来返回已经格式化好的字符串,如果没有得到按照规则的格式化数据则会抛出异常。

了解可变参使用点击:C语言可变参

2、boost.format格式化语法

format使用了类似printf的格式化语法规则,比如说对齐、宽度、精度、字符类型等等。除了以上这些经典的printf用法,还增加了%|spec|来区分格式化选项与普通字符,%N%来标记第N个参数的占位等功能,在语法上比printf的更加完善和易懂。

3、代码示例

// BoostFormat.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <boost/format.hpp>

using namespace std;
using namespace boost;

int main()
{
	cout << "----------------boost.format的使用示例-----------------" << endl;
	cout << "-------------------------------" << endl;
	boost::format fmt("(%1% + %2%) * %3% = %4%\n");
	fmt % ((2 + 3) * 4);
	cout << fmt.str();
	cout << "-------------------------------" << endl;
	cout << boost::format("%s: %d+%d=%d\n") % "sum" % 5 % 6 % (5 + 6);

	cout << "-------------------------------" << endl;
	//对下面的表达式进行解释,||用来区分格式化选项功能,可以不要,当表达式中含有空格等特殊字符占位时,使用||表达更容易区分些
	// %|04d|输出宽度为4的数值,不足位用0补充
	// %|-8.4f|左对齐,输出宽度为8,小数位保留4为的浮点数
	// %| 8s|输出宽度为8的字符串,不足位用空格填补的字符串
	// %|06X|输出宽度为6的大写16进制整数,不足位用0填补
	boost::format tmpFormat("%|04d|\n %|-8.4f|\n %| 8s|\n %|06X|\n");
	tmpFormat % 44 % 3.1415926 %"123456" % 48;
	// 使用boost自带的str()函数获取表达式,也可以使用format的自带成员函数str(),注意二者的使用不同
	string tmpFormatStr = boost::str(tmpFormat);
	cout << tmpFormatStr << endl;
    std::cout << "Hello World!\n";
	getchar();
}

运行结果:
在这里插入图片描述

二、boost.format组件的高级用法

1、format的高级用法

format提供的一些函数可以在程序运行时修改格式化选项和绑定输入参数功能。一些函数介绍如下:
bind_arg(int argn, const T &value):把第argn位的输入参数绑定为一个固定的数值value。
clear_bind(int argn):取消第argn位的参数绑定。
clear_binds():取消所有位的参数绑定。
modify_item(int itemn, T manipulator):设置格式化字符串itemn的格式选项,manipulator是一个boost::io::group()返回的对象。
boost::io::group(T1 a1,…,Var const & var):这是一个模板函数,可以设置输出或者输入流控制器来指定格式或者输入参数值。

2、代码示例

// BoostFormat.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <boost/format.hpp>
#include <iomanip>

using namespace std;
using namespace boost;

int main()
{
	cout << "----------------boost.format的高级用法-----------------" << endl;
	// 5个格式化选项,3个输入参数
	boost::format fmt("%1% %2% %3% %1% %2%");
	fmt % 2 % 4 % 6;
	cout << fmt.str() << endl;
	cout << "------------------------------------------" << endl;

	// 绑定第二个参数为8
	fmt.bind_arg(2, 8);
	fmt % 7 % 9;
	cout << fmt.str() << endl;
	cout << "------------------------------------------" << endl;

	// 清空fmt的缓存
	fmt.clear();

	// 把第一个输入参数设置为8进制的数
	fmt % boost::io::group(showbase,oct,12) % 33;
	cout << fmt.str() << endl;
	cout << "------------------------------------------" << endl;

	// 清楚所有的绑定
	fmt.clear_binds();

	// 设置第一个格式化项为十六进制,宽度为8,右对齐,不足位用$补充
	fmt.modify_item(1, boost::io::group(hex, right, showbase,setw(8),setfill('$')));
	fmt % 48 % 20 % 100;
	cout << fmt.str() << endl;

    std::cout << "Hello World!\n";
	getchar();
}

运行结果:
在这里插入图片描述

原创不易,点赞鼓励一下吧!

posted @ 2020-04-05 13:19  ISmileLi  阅读(278)  评论(0编辑  收藏  举报