MFC CStdioFlie类静态对象对文件的读写操作问题

原创 2013年12月02日 14:36:59

//头文件

#pragma once
#include "afx.h"

class CLogProcedure
{
 public:
  CLogProcedure(void);
  ~CLogProcedure(void);
  static voidCreateLogFile();//负责创建log文件
  static void WriteLogFile( DWORDdwErrorLevel, LPCTSTR lpOutputString, LPCTSTR lpfunc, INT iline);//负责写log文件
  
  enum E_LOG_OUTPUT_LEVEL
  {
   E_LOGLEVEL_FAILED= -1 ,
   E_LOGLEVEL_INFORMATION= 0 ,
   E_LOGLEVEL_SUCCEEDED= 1
  };

 private:
   staticCStdioFile m_plogFile;//最容易出现问题的地方,因为是静态的变量,那么需要注意的是进行初始化

};

 

//CPP

#include "StdAfx.h"
#include <locale.h>
#include "LogProcedure.h"

CStdioFileCLogProcedure::m_plogFile;//很重要的初始化语句因为静态的变量在类中只能被声明,而在类外进行定义(也就是初始化)

CLogProcedure::CLogProcedure(void)
{
 //CreateLogFile();//创建日志文件
}

CLogProcedure::~CLogProcedure(void)
{

}
 
void CLogProcedure::CreateLogFile()
{
 #define MAX_PATH_SIZE (0x100)
 static BOOL logFileState =false;//静态变量只会被初始化一次

 if( false == logFileState )
 {
  TCHARtcPath[MAX_PATH_SIZE];//设置路径缓冲区
  GetModuleFileName(NULL, tcPath,MAX_PATH_SIZE);//检索当前进程所执行的可执行文件的路径,就是获得当前可执行文件的路径

  CStringfilename(tcPath);//两份路径的存放
  CString strLogName(tcPath);
  CString strLogDir;
  INT index =filename.ReverseFind(_T('\\'));//返回的是该字符串所在的位置索引
  if( -1 != index )
  {
   INT len =filename.GetLength();
   ++index;
   filename.Delete(index,len - index);//这样就找到了可执行文件的名字了,返回的是剩下的字符串
   strLogDir =filename;//路径获得
   strLogDir +=_T("Log\\");
   CreateDirectory(strLogDir,NULL);//成功的话返回值非零,创建一个新的目录
   CStringstrTemp;
   strLogName.Delete(0,index);//从开始删除到可执行文件的名字的地方,剩下的就是可执行文件名和扩展名了
   strTemp =strLogName.Mid(0,strLogName.ReverseFind(_T('.')));//返回值是整体到点结束的字符串,因为可执行文件带有扩展名.exe,所以截取可执行文件的名称
   time_tnowTime;
   time(&nowTime);//添加此时的秒数,这里是引用,直接传送地址
   strLogName.Format(_T("Log\\RUN_%s_%d_LOG.txt"),strTemp, nowTime);//定义文件log的名称是。。。
  }

  filename +=strLogName;//文件名称的路径
  if( m_plogFile.Open( filename,CFile::modeCreate |\
           CFile::modeNoTruncate |\
           CFile::shareDenyWrite |\
           CFile::modeWrite ) )//用这样的模式进程创建或者检查文件名称的路径
  {
   logFileState=true;//然后给标志一个新的标志,对此标志进行判断的时候就可以防止(在多次进行写入该次程序运行的时候多个地方的log信息)多次打开文件log文件
  }

 }
}

void CLogProcedure::WriteLogFile( DWORD dwErrorLevel, LPCTSTRlpOutputString, LPCTSTR lpfunc, INT iline )
{
 CreateLogFile();//创建日志文件

 char* org = _strdup( setlocale(LC_CTYPE,NULL));//为setlocale(LC_CTYPE,NULL)分配空间副本
 setlocale( LC_CTYPE,"chs" );//支持简体中文

 CString strErrorLevelInfo;
 switch(dwErrorLevel)
 {
 case E_LOGLEVEL_FAILED:
  strErrorLevelInfo =_T("FAILED");
  break;
 case E_LOGLEVEL_SUCCEEDED:
  strErrorLevelInfo =_T("SUCCEEDED");
  break;
 case E_LOGLEVEL_INFORMATION:
  strErrorLevelInfo =_T("INFOMATION");
  break;
 default:
  strErrorLevelInfo =_T("OTHER");
  break;
  }

 CString outputLog;
 outputLog.Format(_T("The [%s]: at [%d] line--> %s + %s\r\n"), //文件内容的格式
 lpfunc,
 iline,
 strErrorLevelInfo,
 lpOutputString);

 m_plogFile.WriteString(outputLog);
 m_plogFile.Flush();//强制缓冲区的内容写入指定文件
 setlocale( LC_CTYPE, org );
 free( org );

 return;
}

相关文章推荐

MFC文件的读写操作,类的序列化与反序列化,CFile,CFileDialog,CArchive,CStdioFile

一,使用CFileDialog文件对话框 二,使用CArchive和CFile对文件进行读写操作 三,使用CStdioFile实现简单字符串文件操作 四,使用CArchive和CObject.Seri...

基于MFC的文件读写操作

  • 2013年11月13日 18:26
  • 29.13MB
  • 下载

使用MFC的CFile文件类和CArchive串行化类进行二进制文件读写操作

一  编程案例介绍    本案例基于控制台工程,创建专门的演示类CDemo,实现二进制文件的读写串行化操作,具体代码如下: 1 CDemo类定义: class CDemo  { public...

INI文件读写操作类

  • 2009年03月03日 21:37
  • 5KB
  • 下载

文件读写操作类

  • 2012年05月03日 21:44
  • 22KB
  • 下载

MFC中对INI文件的读写操作总结

在南京第二家公司刚接触到在MFC下读写INI配置文件,下面介绍一下关于如何去读写INI配置文件吧。 首先说明一下配置文件的格式: 例如: [COUNT] COUNT=6 [LONGIN] USER=...

MFC中的文件读写操作

计算机室如何管理自身所存放着的大量的信息的呢?windows的磁盘管理程序为我们提供了一套严密而又高效的信息组织形式--硬盘上的信息是以文件的形式被管理的。 面向存储的文件技术 什么是文件?计算机...

MFC中的文件读写操作

MFC中的文件读写操作 由于要写个游戏工具方便编程,要用到文件类的操作,看到这篇文章不错,特转载 计算机室如何管理自身所存放着的大量的信息的呢?windows的磁盘管理程序为我...

MFC中文件读写操作

由于要写个游戏工具方便编程,要用到文件类的操作,看到这篇文章不错,特转载     计算机室如何管理自身所存放着的大量的信息的呢?windows的磁盘管理程序为我们提供了一套严密而又高效的信息组织形式-...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC CStdioFlie类静态对象对文件的读写操作问题
举报原因:
原因补充:

(最多只允许输入30个字)