直接上源码: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++ 输入输出流及本地化》这书中学的,书是好书,可惜买不到了。只能看电子版。
用过流处理,知道好处的兄弟们应该不用我多说什么了吧。