之前开发程序,如果需要格式化string对象,我会定义一个char类型的数组,数组大小一般会定义的非常大,比如10240,存放一般常用的串应该够长了,然后用sprintf对该数组格式化,之后再赋给string。最近开发程序,碰到了串的大小不确定的情况,所以要研究一下string的格式化问题。
string没有提供给我们类似Format的函数,由于这个原因在代码里引入平台有关的MFC,ATL等本来不需要在项目中使用的一些重量级的框架,就为了能轻松的做格式化字符串 。曾尝试过将ATL::CString的format函数提取出来使用,但ATL::CString的底层调用了windows独有函数,无法跨越平台。所以要格式化string要找其他方法。
1.用boost:format
包含头文件#include <boost/format.hpp>
下面的例子说明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;
该方法比较好用,还有一些异常处理,此处不展开说,只说一点,在编译32位程序时,一切正常,但在编译64位程序时,只要用到了boost:format来格式化字符串时,从主函数返回时就会崩溃,跟进boost代码,发现了一个宏BOOST_NO_STD_LOCALE,只要在自己的程序里定义了这个宏,就能解决了,但是原因有待确认。
2.用stringstream
包含头文件#include <sstream>
stringstream ss;
ss<<i<<"dddd"<<3<<"4444";
string strtEST ;
ss>>strtEST;或strtEST=ss.str();//推荐用后者,因为前者也会出现1中所说的崩溃,不知道是为什么
注意stringstream会有内存泄露,它的clear()函数不是清除内容,而是重置流状态标识,每次用完用str("")来清空内容,否则下次再用的话会和上次的串连在一起,最重要的是stringstream分配的内存只有当对像析构时才会释放,clear是不会释放内存的,所以在使用过程中,不要定义全局的stringstream对象,这样效率很低,最好的办法是用到的时候再定义