格式化字符串——以C++的名义 - [软件开发]

此博客已经停止更新,并乔迁新址 http://chenlq.net,感谢大家对本博客的喜爱,

希望在 新的站点能够继续和大家一起交流学习。谢谢大家:)

这几天在做一个项目的移植工作,将其从原来的6.0移植到VS2008上,因为采用了新的unicode字符集,所以在处理字符串的时候遇到了很多问题,转载一篇文章,有帮助。

从第一堂C语言课上的那个printf开始,格式化字符串就成了我的梦魇。此后我还在很多地方遇到过它们:fprintf,sscanf以及 CString的Format成员函数……。除了能记住%s(String的缩写)代表字符串,%d(Decimal的缩写)代表整数之外,每次用到格式 化字符串的地方我都要求助于MSDN。
    直到我看到C++的字符串格式化方式后,我决定从此抛弃C的那套格式化字符串的方法。
    在C++里格式化字符串,用到的最多的类是:ostringstream以及它的宽字符版本wostringstream。

    话不多说,如果要将一个整数n格式化成字符串以便输出之用
    CString的方式是这样的:


 CString str;
 str.Format(_T(
"%d"), n); 
    ostringstream的方式:  


ostringstream ost;
ost
<<n;
string str = ost.str();
    抛开效率不谈,起码不用再去记%d代表整数,%f代表浮点数,当然还有更复杂的格式控制输出的那些%(此处省略200字……)。
    稍微复杂一点,如果要将整数以16进制的格式输出(这个恐怕是整数输出中最常用的功能了)


ostringstream ost;
ost
<<hex<<showbase<<255;
    如果以16进制大写的格式输出:


ostringstream ost;
ost
<<hex<<showbase<<uppercase<<255;
    可有时候希望以32位整数的方式来输出的时候,在前面通常要补上多个0,这时可以这样做:


ostringstream ost;
// 也许有更好的写法
ost<<"0X"<<hex<<uppercase<<setw(8)<<setfill(''0'')<<255;
    比起格式化字符串来输入的字母更多,但我觉得这种以人话写出来的方式比较好记:)

    对于浮点数,最长用的格式化功能莫过于在小数点后保留X位的做法。
    比如在小数点后保留6位:


ostringstream ost;
// 将输出1234.567800
ost<<fixed<<setprecision(6)<<1234.5678;
    保留3位


// 将输出1234.568,已经替我们做好了四舍五入
ost<<fixed<<setprecision(3)<<1234.5678;
    实现机制
    C++使用一种称为操控符的技术来控制格式化的输出。

    经典的Hello World的C++版本大概是这样的:   


std::cout<<"Hello World"<<endl;    这将在标准输出上输出Hello World后附带一个换行,并且刷新cout流。一个简单的endl包含了模板和运算符重载两个C++中极有分量的技术。

    对endl的输出将引发下面这个重载了的<<运算符的调用(摘自VS2008的ostream文件):


_Myt& __CLR_OR_THIS_CALL operator<<(_Myt& (__cdecl *_Pfn)(_Myt&))
    
{    // call basic_ostream manipulator
    _DEBUG_POINTER(_Pfn);
    
return ((*_Pfn)(*this));
    }
    而endl正好满足了这个重载的运算符的参数的格式:


_CRTIMP2_PURE

你可能感兴趣的:(visual,c++)