c++日志类的问题日志

& 一个好用的C++日志生成类
秒后自动跳转到登录页
(奖励5下载豆)
快捷登录:
举报类型:
不规范:上传重复资源
不规范:标题与实际内容不符
不规范:资源无法下载或使用
其他不规范行为
违规:资源涉及侵权
违规:含有危害国家安全等内容
违规:含有反动/色情等内容
违规:广告内容
详细原因:
任何违反下载中心规定的资源,欢迎Down友监督举报,第一举报人可获5-10下载豆奖励。
VC++_6.0使用方法详
C#摄像头源码分享
用C++实现2048游戏的
198个经典C#WinForm
Java 7并发编程实战
Java经典问题答案(
算法与数据结构-实用
一个好用的C++日志生成类
上传时间:
技术分类:
资源评价:
(0位用户参与评价)
已被下载&39&次
VC/C++源码,控件相关,日志类,VC类库  一个好用的C++日志产生类,不但好用,而且它也很老,好像是老外写的,虽然这么多年了,但还是有很多人在用这个日志类。
本资料共包含以下附件:
5-一个好用的C++日志生成类.rar
51CTO下载中心常见问题:
1.如何获得下载豆?
1)上传资料
2)评论资料
3)每天在首页签到领取
4)购买VIP会员服务,无需下载豆下载资源
5)更多途径:点击此处
2.如何删除自己的资料?
下载资料意味着您已同意遵守以下协议:
1.资料的所有权益归上传用户所有
2.未经权益所有人同意,不得将资料中的内容挪作商业或盈利用途
3.51CTO下载中心仅提供资料交流平台,并不对任何资料负责
4.本站资料中如有侵权或不适当内容,请邮件与我们联系()
5.本站不保证资源的准确性、安全性和完整性, 同时也不承担用户因使用这些资料对自己和他人造成任何形式的伤害或损失
下载1032次
下载1391次
下载1445次
下载1350次
下载2154次
相关专题推荐
本专题收录Java经典编程的实例源码,
在国内的开发语言中,java凭借这简单
本套视频教程是韩顺平老师,循序渐进
北京圣思园张龙(风中叶)老师的Java
讲述Arm嵌入式Linux系统下的C语言编程
这段视频是从尚学堂科技的教学课堂上
本套视频共78集,是由郝斌老师根据多
本视频专题共180集涵盖了C语言概述中
本视频专题共107集涵盖了Java概述、数
由传智播客毕向东老师讲解的Java基础
本专题为spring视频教程,共31集。教
本专题为C语言黑客编程系列视频教程,
本专题为韩顺平讲解的Java从入门到精
本专题为Java Web项目开发案例精粹视
SSH为struts+spring+hibernate的一个
本专题为疯狂Java李刚老师讲解的Stru
本周下载热点
意见或建议:
联系方式:
您已提交成功!感谢您的宝贵意见,我们会尽快处理随笔 - 248&
文章 - 0&评论 - 70&trackbacks - 0
在开发当中有的直接调试很方便,有的就不太好调试,所以我经常使用写日志以及输出Debug信息来进行开发。尽管我比较喜欢使用以输出Debug的信息的方式来跟踪程序。因为直接一句话:
OutputDebugString("你想输出的信息\r\n");
&就可以在非调试模式下直接在DebugView上面显示输出信息了。
但是除了这种方式之外有时侯我也会使用写日志的方式来输出调试信息,虽然写文件很简单,但还是记录一下吧。方便自己同时也可能方便需要的人吧。
首先是main()函数定义:
1 #include "RcLogInfo.h"
3 int main(void)
//////////////////////////////////////////////////////////////////////////
char cPath[MAX_PATH];
memset(cPath,0,MAX_PATH);
if (!GetModuleFileName(NULL,cPath,MAX_PATH))
return false;
char *FileName = cPath + strlen(cPath)-1;
while(*FileName !='\\')
*FileName = '\0';
char cFileName[MAX_PATH]={'\0'};
sprintf(cFileName,"%s\\%s",cPath,"TestLog.log");
//////////////////////////////////////////////////////////////////////////
FILE *m_pfLogFile=NULL;
if(NULL != m_pfLogFile)
fclose(m_pfLogFile);
m_pfLogFile = fopen(cFileName,"at+");
if(NULL == m_pfLogFile)
//////////////////////////////////////////////////////////////////////////
rl.SetLogFile(m_pfLogFile);
//////////////////////////////////////////////////////////////////////////
ftime(&aTime);
sprintf(rl.m_cInfo,"写日志测试******************************+++++++++++++++++++++++_________________%s .%ld ms\n",ctime(&(aTime.time)),aTime.millitm);
rl.WriteLogInfo(rl.m_cInfo);
下面是一个写日志类实现:
* 写日志类
#pragma once
#include &windows.h&
#include &atltime.h&
#include &sys/timeb.h&
#include &iostream&
class RcLogInfo
RcLogInfo(void);
~RcLogInfo(void);
//日志文件
FILE* m_pfLogF
char m_cInfo[255];
SetLogFile(FILE *pfLogFile);
WriteLogInfo(const char *pInfo);
&cpp文件:
1 #include "RcLogInfo.h"
3 RcLogInfo::RcLogInfo(void)
m_pfLogFile = NULL;
memset(m_cInfo,NULL,sizeof(m_cInfo));
9 RcLogInfo::~RcLogInfo(void)
if (NULL != m_pfLogFile)
fclose(m_pfLogFile);
m_pfLogFile = NULL;
18 int RcLogInfo::SetLogFile(FILE *pfLogFile)
m_pfLogFile=pfLogF
24 int RcLogInfo::WriteLogInfo(const char *pInfo)
if(NULL != m_pfLogFile)
fprintf(m_pfLogFile,"%s",pInfo);
fflush(m_pfLogFile);
阅读(...) 评论()一个经典的C++日志类
可按日期生成多个日志,
还可分年月日频率生成文件名
//这个代码我用工业现场24X7值守的程序纪录各种信息, 简单易用;
//一般用一个全局日志对象, 有临界排斥可以多线程安全使用。
//有两个类
class LogF//用户定义日志文件名
class LogFileEx;//有日志文件名自动生成功能 , 可分年月日频率生成文件名,
可指定日志存放的目录
LogFile gLog("My.Log");
gLog.Log("test", 4);//记录日志
gLog.Log("系统启动");
LogFileEx gLog(".", LogFileEx ::
YEAR);//一年生成一个日志文件
LogFileEx gLog(".//Log", LogFileEx :: MONTH);//一月生成一个日志文件
LogFileEx gLog(".//Log", LogFileEx :: DAY);//一天生成一个日志文件
//注意日志所属目录创建失败会自动退出, 请注意目录的合法性, 文件生成频率看情况掌握
//24小时运行的程序可以每天生成一个日志文件, 以免内容过多
#ifndef _LOGFILE_H
#define _LOGFILE_H
&assert.h&
#include &time.h&
#include &stdio.h&
#include &windows.h&
class LogFile
protected:
&CRITICAL_SECTION
&char * _szFileN
&HANDLE _hF
&bool OpenFile()//打开文件,
指针到文件尾
& if(IsOpen())
& if(!_szFileName)
=& CreateFile(
&& _szFileName,&
&& GENERIC_WRITE,
&& FILE_SHARE_READ |
FILE_SHARE_WRITE,
&& OPEN_EXISTING,
&& FILE_ATTRIBUTE_NORMAL,
& if(!IsOpen()
&& GetLastError() == 2)//打开不成功,
且因为文件不存在, 创建文件
&& _hFile =&
CreateFile(
_szFileName,&
GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
& if(IsOpen())
&& SetFilePointer(_hFile, 0,
NULL, FILE_END);
& return IsOpen();
&DWORD Write(LPCVOID
lpBuffer, DWORD dwLength)
& DWORD dwWriteLength = 0;
& if(IsOpen())
&& WriteFile(_hFile, lpBuffer,
dwLength, &dwWriteLength, NULL);
&virtual void WriteLog(
LPCVOID lpBuffer, DWORD dwLength)//写日志, 可以扩展修改
& char temp[21];
& DWORD dwWriteL
& if(IsOpen())
time(&now);
&& strftime(temp, 20, "%Y-%m-%d
%H:%M:%S", localtime(&now));
WriteFile(_hFile, "/xd/xa#-----------------------------", 32,
&dwWriteLength, NULL);
&& WriteFile(_hFile, temp, 19,
&dwWriteLength, NULL);
&& WriteFile(_hFile,
"-----------------------------#/xd/xa", 32,
&dwWriteLength, NULL);
&& WriteFile(_hFile, lpBuffer,
dwLength, &dwWriteLength, NULL);
&& WriteFile(_hFile, "/xd/xa", 2,
&dwWriteLength, NULL);
FlushFileBuffers(_hFile);
::EnterCriticalSection(&_csLock); }
&void Unlock() {
::LeaveCriticalSection(&_csLock); }
&LogFile(const char *szFileName =
"Log.log")//设定日志文件名
& _szFileName = NULL;
& _hFile = INVALID_HANDLE_VALUE;
::InitializeCriticalSection(&_csLock);
SetFileName(szFileName);
&virtual ~LogFile()
::DeleteCriticalSection(&_csLock);
& Close();
& if(_szFileName)
&& delete []_szFileN
&const char * GetFileName()
& return _szFileN
&void SetFileName(const
char *szName)//修改文件名, 同时关闭上一个日志文件
& assert(szName);
& if(_szFileName)
[]_szFileN
& Close();
& _szFileName = new
char[strlen(szName) + 1];
& assert(_szFileName);
& strcpy(_szFileName, szName);
&bool IsOpen()
& return _hFile != INVALID_HANDLE_VALUE;
&void Close()
& if(IsOpen())
&& CloseHandle(_hFile);
&& _hFile =
INVALID_HANDLE_VALUE;
&void Log(LPCVOID
lpBuffer, DWORD dwLength)//追加日志内容
& assert(lpBuffer);
&& Lock();
if(!OpenFile())
WriteLog(lpBuffer, dwLength);
& __finally
&& Unlock();
&void Log(const char
& Log(szText, strlen(szText));
private://屏蔽函数
&LogFile(const
LogFile&);
&LogFile&operator = (const
LogFile&);
class LogFileEx : public LogFile
protected:
&char *_szP
&char _szLastDate[9];
&void SetPath(const char
& assert(szPath);
& WIN32_FIND_DATA
& char temp[MAX_PATH + 1] = {0};
if(FindFirstFile(szPath, &wfd) ==
INVALID_HANDLE_VALUE &&
CreateDirectory(szPath, NULL) == 0)
&& strcat(strcpy(temp, szPath), "
Create Fail. Exit Now! Error ID :");
&& ltoa(GetLastError(), temp +
strlen(temp), 10);
&& MessageBox(NULL, temp, "Class
LogFileEx", MB_OK);
&& exit(1);
&& GetFullPathName(szPath,
MAX_PATH, temp, NULL);
&& _szPath = new
char[strlen(temp) + 1];
&& assert(_szPath);
&& strcpy(_szPath, temp);
&enum LOG_TYPE{YEAR = 0,
MONTH = 1, DAY = 2};
&LogFileEx(const char
*szPath = ".", LOG_TYPE iType = MONTH)
& _szPath = NULL;
& SetPath(szPath);
& _iType = iT
& memset(_szLastDate, 0, 9);
&~LogFileEx()
& if(_szPath)
&& delete []_szP
&const char *
& return _szP
&void Log(LPCVOID
lpBuffer, DWORD dwLength)
& assert(lpBuffer);
& char temp[10];
& static const char format[3][10] = {"%Y",
"%Y-%m", "%Y%m%d"};
&& Lock();
&& time_t now =
time(NULL);
strftime(temp, 9, format[_iType],
localtime(&now));
if(strcmp(_szLastDate, temp) != 0)//更换文件名
strcat(strcpy(_szFileName, _szPath), "//");
strcat(strcat(_szFileName, temp), ".log");
strcpy(_szLastDate, temp);
if(!OpenFile())
&& WriteLog(lpBuffer,
dwLength);
& __finally
&& Unlock();
&void Log(const char
& Log(szText, strlen(szText));
private://屏蔽函数
&LogFileEx(const
LogFileEx&);
&LogFileEx&operator = (const
LogFileEx&);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。二次元同好交流新大陆
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
&& & 如果你仅仅把C++当作C来使用,那么,请直接使用C。否则含有C++语法的C程序不但不能从C++中得到任何好处,反而会因为C++的种种陷阱让程序还不如直接用C来写简单和不易出错。&& & 1:把成员公有化,类当作带成员函数的结构体使用。&& &
成员暴露,到处赋值,再加上下面几点的因素综合起来,使程序混乱和容易出错,修改也比用C写的代码更为困难。&& & 2:残废的构造函数。&& &
除了构造函数之外,又有一个Init之类的函数用于初始化,导致初始化语义含混不清。典型的用C的思想来写C++。&& &
记住,构造即初始化。&& & 3:包罗万象的超级类。&& &
什么东西都放在一个超级类里面。越来越膨胀。相当于什么都是全局变量。可能用C来写反而不需要那么多全局变量。&& & 4:滥用派生,把派生当成简单的代码重用。&& &
派生关系缺乏设计上的考虑,看到可以重用代码就进行派生,然后成员和虚函数到处乱放。基类的成员放在派生类里面操作,派生类的操作又放在基类里面写成虚函数。这种问题也是把C++当作C来用,认为C++就是一堆数据和函数,派生仅仅是一种语法上的方便,完全无视面向对象方法的规范。结果造成种种混乱,还不如直接用C写来的简单。&& &
派生本来是为了“高内聚低耦合”的设计理念而生的,滥用派生的结果适得其反。其实很多派生都是不必要的,可以简单的实现为成员。&& &
谨记,friend代表最高的耦合,派生其次,成员再其次,引用耦合度最低。 &二:过于依赖C++语法,是设计缺陷的表现。&& & 有一个“需求”如下:&& & “简单说,我有几个接口是一层层继承下来的,唤作 iA iB 。iA 是基类,iB 继承至 iA 。然后,我写了一个&cA 类,实现了 iA 接口;接下来我希望再写一个 cB 类,实现 iB 接口。但是,iB 接口的基类 iA 部分,希望复用已经写好的 cA 类。” 用虚继承可以简单的满足这个需求:#define interface structinterface iA {&& &virtual void foo() = 0;};interface iB : virtual public iA {&& &virtual void bar() = 0;};class cA : virtual public iA {&& &virtual void foo();&& &// etc...};class cB : virtual cA , virtual public iB {&& &virtual void bar();&& &// etc...};&& & 其实要实现上述需求大可不必采用“虚继承”之类的“重量级”语法。只需稍作改变。// 去掉虚继承interface iA {&& &virtual void foo() = 0;};interface iB : public iA {&& &virtual void bar() = 0;};class cA : public iA {&& &virtual void foo();&& &// etc...};// 继承改成员class cB : public iB {public:&&virtual void foo(){mA-&foo();}public:&&virtual void bar();&&// etc...private:&&cA* mA;};&& & 这实际上就是一个Decorator。&& & 甚至我们可以更进一步探讨这种“需求”是否适当,是否可以有其他更简单的“需求”。&& & 其实很多这类问题,完全可以从设计上解决,根本无需过于依赖语法。&& & 三:过度设计。&& & 这就走向了前两个错误的另一个极端。虽然本人常常见到的都是前两个错误,但是过度设计也不可不防。&& & 简单,常常是我们写程序追求的目标。面对同样的需求,C++有“多种”实现方法,于是C++“把简单的问题复杂化”。于是,就容易产生上面所说的种种问题。&&
殊不知,貌似“多种”的实现方法在具体应用场景下也有好有坏,有合适有不合适,如何从中选择,是设计者的事情,而不是语言本身的问题。那些用简单的C写成的程序,有些技术含量之高,显然并不那么“简单”。
阅读(631)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_094070',
blogTitle:'C++的几类错误用法',
blogAbstract:'&& &&& &一:把C++当作带C++语法的C使用。&& &\t如果你仅仅把C++当作C来使用,那么,请直接使用C。否则含有C++语法的C程序不但不能从C++中得到任何好处,反而会因为C++的种种陷阱让程序还不如直接用C来写简单和不易出错。&& &\t1:把成员公有化,类当作带成员函数的结构体使用。&& &\t\t成员暴露,到处赋值,再加上下面几点的因素综合起来,使程序混乱和容易出错,修改也比用C写的代码更为困难。&& &\t2:残废的构造函数。&& &\t\t除了构造函数之外,又有一个Init之类的函数用于初始化,导致初始化语义含混不清。典型的用C的思想来写C++。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:8,
permalink:'blog/static/',
commentCount:2,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}求助:用于记录Log日志的常用的c/c++类库有哪些?
[问题点数:200分,结帖人fengbingchun]
求助:用于记录Log日志的常用的c/c++类库有哪些?
[问题点数:200分,结帖人fengbingchun]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
2013年7月 VC/MFC大版内专家分月排行榜第三2011年12月 VC/MFC大版内专家分月排行榜第三
2011年 总版技术专家分年内排行榜第三2010年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第五
2007年10月 VC/MFC大版内专家分月排行榜第二
2009年7月 总版技术专家分月排行榜第二2009年3月 总版技术专家分月排行榜第二2009年1月 总版技术专家分月排行榜第二2005年7月 总版技术专家分月排行榜第二2005年5月 总版技术专家分月排行榜第二2005年3月 总版技术专家分月排行榜第二
优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年2月论坛优秀版主
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 会计类实习日志 的文章

 

随机推荐