通常在开发中,我们需要将数值转换为字符串进行输出和操作,在C库中我人可以使用sprintf/fprintf系统函数,在C++标准库中我们可以使用stringstream,以及本文所介绍的Boost.format类库。

C库中的sprintf/fprintf系统函数都针对一个指定长度的缓冲区进行操作,因此在不同的情况下设置缓冲区的长度以及缓冲区的长度而引起的缓冲区溢出问题会大大增加系统的安全隐患。

C++标准库中的stringstream相对于C库中的格式化函数是一个不错的选择,但是Boost.format相比于std::stringstream是一个更好的选择,因为其简单,高效且易用。
下面的例子用于说明 Boost.format的使用方法:

boost::format 使用方法
#include <boost/format.hpp>
#include <string>
#include <stdio.h>

int main( int argc , char *argv[] )
{
    using boost::format;
    boost::format formater( "%1% %2%" );;
    std::string strText = str( formater % 123 % "number" );
    fprintf( stdout , "%s\n" , strText.c_str() );

    strText = str( formater % 'c' % 3.14 );
    fprintf( stdout , "%s\n" , strText.c_str() );

    // 可以直接使用 "%N%" 来指定格式化的参数是传递的参数中的哪一个
    strText = str( boost::format( "%1% %1% %2% %2%" ) % 1 % 2 );
    fprintf( stdout , "%s\n" , strText.c_str() );

    // 也可以使用 "%s %d %f" 之类的printf格式的格式化字符指令来确定指定的参数被格式化的形式
    strText = str( boost::format( "%s , %d , %f" ) % "abc" % 123 % 456.7 );
    fprintf( stdout , "%s\n" , strText.c_str() );

    // 使用 "%N%" 比 "%flag" 的好处在于,前者可以在格式化时对传递进来的参数使用多次.

    formater % 9;

    // 清除之前传入的参数 "9"
    formater.clear();
    formater % 1234 % 5678;
    fprintf( stdout , "%s\n" , formater.str().c_str() );

    // 改变其中的某个传入的参数
    formater % 12 % 34;
    formater.bind_arg( 1 , 6666 );
    fprintf( stdout , "%s\n" , formater.str().c_str() );

    // 一旦格式化成功之后,如果调用任何的函数获取了其中的"格式化之后的字符串",那么这个格式化的字符串将不能再进行参数的修改了,
    // 直到下一次调用 "%" 传入参数开始,之前被格式化的参数将会被清除,以新传入的参数进行新的格式化操作.

    return 0;
}

本站原创文章,转载请注明出处。