|
/*************************************
* WIN32程序调试输出器 for Visual C++ (主要适用于开发全屏游戏又没有联机调试条件的个人开发者!)
* chunfengzhao@sina.com
* nwpu.狗蛋.
* 如果你对此有所改进,请告诉我一下!
************************************************************/
//注意,这个调试器只在 Debug模式下有效,对Release模式没任何影响(Release模式下自动屏蔽所有调试代码)!
//默认输出文件:debug.log
//如果配合VC 内部定义的几个宏:__FILE__,__LINE__......效果更好!
//使用方法:在需要调试的文件中包含这个头文件
//声明一个调试器对象,如:DebugStream debuger;或DebugStream debuger(1);或DebugStream debuger("debug.txt");
//推荐使用:DebugStream debuger("somefile.txt");
//在欲输出的地方就用:debuger<<"some message.."<<456<<...
//就像cout<<....一样,注意,用endlf换行,如debuger<<endlf;
/**************例子*******
DebugStream debug(1);
int WINAPI WinMain(…){
……
int x=0;
BOOL r=game.Init(&x);
if(!r){
debug<<”游戏初始化失败”<<”x=”<<x<<endlf;
return 0;
}
……
}
*///////////////////////////////////////////////////////////////////
#ifndef _DEBUG_H_
#define _DEBUG_H_
#ifdef _DEBUG
#include<windows.h>
#include<stdio.h>
struct _FENDL_{//这是一个没有实际内容的数据类型,仅仅是为了创建一种与基本类型不相冲突的重载
};
#define endlf ((_FENDL_ *)0)
class DebugStream {
HANDLE file;
bool buffered;
public:
void SignUp(HANDLE fl=INVALID_HANDLE_VALUE){
if(fl==INVALID_HANDLE_VALUE) return;
char msg[256];
unsigned char end[4]={0xd,0xa,0xd,0xa};
sprintf(msg,"编译时间:%s,%s.",__DATE__,__TIME__);
DWORD writein;
SetFilePointer(fl,0,0,FILE_END);
WriteFile(fl,end,4,&writein,NULL);
WriteFile(fl,&msg,(DWORD)strlen(msg),&writein,NULL);
WriteFile(fl,end,2,&writein,NULL);
};
DebugStream(bool b=false){//当指明b=true时,会启用缓存,log文件仅仅被打开一次,但是可能造成冲突
//否则,每一次<<操作将会打开,关闭文件一次
buffered=b;
if(b){
file=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(file==INVALID_HANDLE_VALUE) buffered=false;
else SignUp(file);
}
}
DebugStream(char* filename){//指明调试的输出文件
if(NULL==filename) buffered=false;
else{
file=CreateFile(filename,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(file==INVALID_HANDLE_VALUE) buffered=false;
else {
SignUp(file);
buffered=true;
}
}
}
~DebugStream(){
if(buffered){
if(file!=INVALID_HANDLE_VALUE) CloseHandle(file);
}
}
DebugStream &operator<<(char c){
if(buffered){
DWORD writein;
SetFilePointer(file,0,0,FILE_END);
WriteFile(file,&c,1,&writein,NULL);
}
else{
HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(f!=INVALID_HANDLE_VALUE){
DWORD writein;
SetFilePointer(f,0,0,FILE_END);
WriteFile(f,&c,1,&writein,NULL);
CloseHandle(f);
}
}
return *this;
}
DebugStream &operator<<(char *s){
if(buffered){
DWORD writein;
SetFilePointer(file,0,0,FILE_END);
WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);
}
else{
HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(f!=INVALID_HANDLE_VALUE){
DWORD writein;
SetFilePointer(f,0,0,FILE_END);
WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);
CloseHandle(f);
}
}
return *this;
}
DebugStream &operator<<(int x){
char s[32];
sprintf(s,"%d",x);
if(buffered){
DWORD writein;
SetFilePointer(file,0,0,FILE_END);
WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);
}
else{
HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(f!=INVALID_HANDLE_VALUE){
DWORD writein;
SetFilePointer(f,0,0,FILE_END);
WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);
CloseHandle(f);
}
}
return *this;
}
DebugStream &operator<<(unsigned int x){
char s[32];
sprintf(s,"%u",x);
if(buffered){
DWORD writein;
SetFilePointer(file,0,0,FILE_END);
WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);
}
else{
HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(f!=INVALID_HANDLE_VALUE){
DWORD writein;
SetFilePointer(f,0,0,FILE_END);
WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);
CloseHandle(f);
}
}
return *this;
}
DebugStream &operator<<(_FENDL_ *p){
unsigned char end[2]={0xd,0xa};
if(buffered){
DWORD writein;
SetFilePointer(file,0,0,FILE_END);
WriteFile(file,end,2,&writein,NULL);
}
else{
HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(f!=INVALID_HANDLE_VALUE){
DWORD writein;
SetFilePointer(f,0,0,FILE_END);
WriteFile(f,end,2,&writein,NULL);
CloseHandle(f);
}
}
return *this;
}
DebugStream &operator<<(float x){
char s[32];
sprintf(s,"%.8f",x);
if(buffered){
DWORD writein;
SetFilePointer(file,0,0,FILE_END);
WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);
}
else{
HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(f!=INVALID_HANDLE_VALUE){
DWORD writein;
SetFilePointer(f,0,0,FILE_END);
WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);
CloseHandle(f);
}
}
return *this;
}
DebugStream &operator<<(double x){
char s[32];
sprintf(s,"%.16f",x);
if(buffered){
DWORD writein;
SetFilePointer(file,0,0,FILE_END);
WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);
}
else{
HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(f!=INVALID_HANDLE_VALUE){
DWORD writein;
SetFilePointer(f,0,0,FILE_END);
WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);
CloseHandle(f);
}
}
return *this;
}
DebugStream &operator<<(long x){
char s[32];
sprintf(s,"%l",x);
if(buffered){
DWORD writein;
SetFilePointer(file,0,0,FILE_END);
WriteFile(file,s,(DWORD)strlen(s),&writein,NULL);
}
else{
HANDLE f=CreateFile("debug.log",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(f!=INVALID_HANDLE_VALUE){
DWORD writein;
SetFilePointer(f,0,0,FILE_END);
WriteFile(f,s,(DWORD)strlen(s),&writein,NULL);
CloseHandle(f);
}
}
return *this;
}
};
#pragma warning(disable:4267)
#else
#define DebugStream /##/
#define debug /##/
#endif
#endif
[em3] |
|