boost/format试用

   下面这段程序是c#中如何进行字符串格式的代码片段:
1            Console.WriteLine(string.Format("{0} is {1} is {2}"1"dxfcv222"123.45678f));
2
   大家可以看到,简单明了非常好用。format函数甚至允许多个位置采用相同的参数,比如:
1            Console.WriteLine(string.Format("{0} is {1} is {1}"1"dxfcv222"123.45678f));
2
   
   在c++中串格式化函数就没那么好用了。下面给出一段c++中进行串格式化的代码:
   
1    char buffer3[256];
2    sprintf(buffer3, "%5d is % 5.6s is %-7.2f"1"1234567"12.34567);
3    cout << buffer3 << endl;
4
    大家可以看到,这样一段代码,其实问题是很多的。1。我们申请了一个缓冲区,其大小是256,该缓冲区如果开大了造成资源浪费,如果开小了那肯定会异常,多么头疼的问题。2。无法在编译期检测出格式化串输入错误问题,比如我们把"%5d is % 5.6s is %-7.2f"错输入为"%5a is % 5.6s is %-7.2f"这个错误只有在程序崩溃的时候才能够暴露出来。3。易用性不好。


   为此,我写了个格式化串的类FormatString,其出发点就是在c++中模拟c#中串格式化语法,减少出错可能性,提高易用性。其典型使用代码片段如下:
1string buffer = FormatString("scene\\{0}.ini"<< serial << OVER;

   缺点是效率不高,能处理的情况也很有限(只能处理基本数据类型)  。无法设置参数格式化精度和输出样式(比如左对齐,局中对齐等),字符填充等。

   下面向大家介绍我们今天的明星,boost/format~~~~~~~~~~~~~~~~~~~~~`。
   format 类型是boost库中包含的一个用来格式化串的类型。该类型兼容了c风格的
   串格式化格式,同时也提供了一套更加直观的boost 风格的串格式化格式。另外该类型提供了一些printf()函数不支持的特性,比如输入参数局中显式,用户自定义类型格式化输出等。下面给出部分使用代码片段:
      
1  //c 风格的格式化。
2    cout << format("%5d is % 5.6s is %-7.2f"% 1 % "1234567" % 12.34567 << endl;
3

1    //boost 风格格式化。
2    cout << format("%1% is %2% is %3%"% 1 
3                                        % 1.234f 
4                                        % "dxfcv222" << endl;

   有兴趣的朋友可以到 boost 网站查询关于 format 类型的更多信息。网址如下:
   http://www.boost.org


posted on 2006-12-04 00:47  小峰  阅读(657)  评论(0)    收藏  举报

导航