zoukankan      html  css  js  c++  java
  • 浅尝boost之format

    浅尝boost之format

    http://www.cnblogs.com/wuerping/archive/2005/04/21/142308.html

    概述

         std::string是个很不错的东东,但实际使用时基本在每个程序里都会遇到不愉快的事情:格式化字符串。我 甚至由于这个原因在代码里引入平台有关的MFC,ATL等本来不需要在项目中使用的一些重量级的框架,就为了能轻松的做格式化字符串 :-) 。曾尝试过将ATL::CString的format函数提取出来使用,但ATL::CString的底层调用了windows独有函数,无法跨越平台。 当然,现在有了boost::format,我们不用再担心了。boost::format重载了'%'操作符,通过多次调用'%'操作符就能将参数非常 方便格式化成字符串,并实现了ATL::CString和C#中的string两者的格式化字符串功能。除了语法刚开始感觉到怪异,功能足以让人感觉到兴 奋!

    一、boost::format工作的方式
     
     基本的语法,boost::format( format-string ) % arg1 % arg2 % ... % argN
     
     下面的例子说明boost::format简单的工作方式 
      
     

    // 方式一
    cout << boost::format("%s") % "输出内容" << endl;

    // 方式二
    std::string s;
    s
    = str( boost::format("%s") % "输出内容" );
    cout
    << s << endl;

    // 方式三
    boost::format formater("%s");
    formater
    % "输出内容";
    std::
    string s = formater.str();
    cout
    << s << endl;

    // 方式四
    cout << boost::format("%1%") % boost::io::group(hex, showbase, 40) << endl;


    二、boost::format实际使用的实例
     
     格式化语法: [ N$ ] [ flags ] [ width ] [ . precision ] type-char 
      
     

    // ATL::CString风格
    cout << boost::format("\n\n%s"
    "%1t 十进制 = [%d]\n"
    "%1t 格式化的十进制 = [%5d]\n"
    "%1t 格式化十进制,前补'0' = [%05d]\n"
    "%1t 十六进制 = [%x]\n"
    "%1t 八进制 = [%o]\n"
    "%1t 浮点 = [%f]\n"
    "%1t 格式化的浮点 = [%3.3f]\n"
    "%1t 科学计数 = [%e]\n"
    )
    % "example :\n" % 15 % 15 % 15 % 15 % 15 % 15.01 % 15.01 % 15.01 << endl;

    // C#::string风格
    cout << boost::format("%1%"
    "%1t 十进制 = [%2$d]\n"
    "%1t 格式化的十进制 = [%2$5d]\n"
    "%1t 格式化十进制,前补'0' = [%2$05d]\n"
    "%1t 十六进制 = [%2$x]\n"
    "%1t 八进制 = [%2$o]\n"
    "%1t 浮点 = [%3$f]\n"
    "%1t 格式化的浮点 = [%3$3.3f]\n"
    "%1t 科学计数 = [%3$e]\n"
    )
    % "example :\n" % 15 % 15.01 << endl;


    输出结果
    /*
    example :
    十进制 = [15]
    格式化的十进制 = [ 15]
    格式化十进制,前补'0' = [00015]
    十六进制 = [f]
    八进制 = [17]
    浮点 = [15.010000]
    格式化的浮点 = [15.010]
    科学计数 = [1.501000e+001]
    */


    三、boost::format新的格式说明符
     
     %{nt}
     当n是正数时,插入n个绝对制表符
     cout << boost::format("[%10t]")  << endl;
     
     %{nTX}
     使用X做为填充字符代替当前流的填充字符(一般缺省是一个空格)
     cout << boost::format("[%10T*]")  << endl; 

    四、异常处理

     一般写法:

    try
    {
    cout
    << boost::format("%d%d") % 1 << endl;
    }

    catch(std::exception const & e)
    {
    cout
    << e.what() << endl;

    // 输出内容:
    // boost::too_few_args: format-string refered to more arguments than were passed
    }


     boost::format的文档中有选择处理异常的办法,不过个人感觉实用性可能不强,下面是文档中的例子 
     

    // boost::io::all_error_bits selects all errors
    // boost::io::too_many_args_bit selects errors due to passing too many arguments.
    // boost::io::too_few_args_bit selects errors due to asking for the srting result before all arguments are passed

    boost::format my_fmt(
    const std::string & f_string)
    {
    using namespace boost::io;
    format fmter(f_string);
    fmter.exceptions( all_error_bits
    ^ ( too_many_args_bit | too_few_args_bit ) );
    return fmter;
    }

    cout
    << my_fmt(" %1% %2% \n") % 1 % 2 % 3 % 4 % 5;

     
    五、还有其它一些功能,但暂时感觉派不上用处,就不去深究了。

  • 相关阅读:
    [NOI2004] 郁闷的出纳员
    [洛谷P4556] 雨天的尾巴
    【转】进程、线程、 GIL全局解释器锁知识点整理
    Python3中的SocketServer
    socket 上传文件代码
    python socket 连续send,出现粘包问题
    【转】动态导入模块的两种方法
    【转】面向对象高级语法部分
    python的垃圾回收机制和析构函数__del__
    django 项目使用setting文件里定义的变量方法
  • 原文地址:https://www.cnblogs.com/cutepig/p/1375145.html
Copyright © 2011-2022 走看看