直接上源码:dbgout.h
代码:
/******************************** * DBGOUT (ver 1.3) by triones 2010-03-26. * * indentation:1 Tab == 2 Blank * * !!!注意!!!在主文件包含前,请声明 #define _DBGOUT,以定义全局变量errs * 其它只需要包含头文件即可 * * DEMO: * errs<<"debugview中输出一个int值"<<12345678<<endd; * errs<<"debugview中输出一个十六进制值"<<hex<<0x12345678<<endd; * errs<<errTchar(TEXT("输出Unicode字符"))<<endd; * * 同样,你可以把errTchar应用于cout(因为只有wcout能输出Unicode) * cout<<errTchar(TEXT("输出Unicode字符"))<<endl; * * 但你不能把endd应用在cout,cerr等中,否则将出错 * * 当然使用全局errs,在多线程下产生冲突。没有关系,你可以在需要时定义一个局部ostringstream用于输出。 * * 2010-05-11 去除errTchar的容量限制,动态申请空间(ver 1.2) * 2010-06-08 发现errTchar对Unicode的自行计算会让编译器做出奇怪结果(EB FE死循环),故调用标准库。(ver 1.3) ********************************/ #pragma once #include <windows.h> #include <iostream> #include <sstream> #include <iomanip> using namespace std; #ifdef _DBGOUT ostringstream errs; #else extern ostringstream errs; #endif /******************************** * 用于确定在DebugView输出信息 ********************************/ template<class _Elem,class _Traits> inline basic_ostream<_Elem, _Traits>& __CLRCALL_OR_CDECL endd(basic_ostream<_Elem, _Traits>& _Ostr) { ostringstream& oo = (ostringstream&)_Ostr; OutputDebugStringA(oo.str().c_str()); //注意到OutputDebugStringW将最终调用OutputDebugStringA,反而效率低下 oo.clear(); oo.str(""); return (_Ostr); } /******************************** * 用于转换Unicode为ASCII ********************************/ class errTchar { public: explicit errTchar(wchar_t* lpstr):lpstr_(lpstr){} private: wchar_t* lpstr_; template<class _Elem,class _Traits> friend basic_ostream<_Elem, _Traits>& operator<<(basic_ostream<_Elem, _Traits>& _Ostr,const errTchar& m) { int len = wcslen(m.lpstr_); ++len; len*=sizeof(wchar_t); char* buf = new char[len]; WideCharToMultiByte(CP_ACP,0,m.lpstr_,-1,buf,len,0,0); _Ostr<<buf; delete[] buf; return (_Ostr); } };
这招是从《标准C++ 输入输出流及本地化》这书中学的,书是好书,可惜买不到了。只能看电子版。
用过流处理,知道好处的兄弟们应该不用我多说什么了吧。