Windows下一个LogFile类

头文件:

#ifndef __LOGFILE__H__
#define __LOGFILE__H__

// Include fstream header
#ifndef _FSTREAM_

#include <fstream>
using namespace std;

#endif

class CLogFile
{
public:
    void PrintCurTime();
    CLogFile();
    CLogFile(TCHAR* tszFileName);
    ~CLogFile();
    CLogFile& operator <<(long lVal);
    CLogFile& operator <<(const TCHAR* str);
    CLogFile& operator <<(TCHAR tch);
    CLogFile& operator <<(int nVal);
    CLogFile& operator <<(unsigned long ulVal);
    CLogFile& operator <<(double dVal);
    CLogFile& operator <<(unsigned int unVal);
    void	  LOGERROR(TCHAR* formatString, ...);

private:
    ofstream *m_cOutFile;
    void	Output(const TCHAR* data);
};

#endif	// __LOGFILE__H__

cpp文件:

#include "stdafx.h"
#include <afxwin.h>
#include <strstream>
#include "logfile.h"
using namespace std;

CLogFile::CLogFile()
{
    //Open file
    m_cOutFile = new ofstream(_T("c:\\smartform.log"), ios_base::out);
    if (!m_cOutFile->is_open())
    {
        AfxMessageBox(_T("Unable to create log file"));
        delete m_cOutFile;
        m_cOutFile = NULL;
    }
}

CLogFile::CLogFile(TCHAR* tszFileName)
{
    m_cOutFile = new ofstream(tszFileName, ios_base::out);
    if (!m_cOutFile->is_open())
    {
        AfxMessageBox(_T("Unable to create log file"));
        delete m_cOutFile;
        m_cOutFile = NULL;
    }
}

CLogFile::~CLogFile()
{
    //Close the file and do clean up
    m_cOutFile->close();
    delete m_cOutFile;
    m_cOutFile = NULL;
}

void CLogFile::Output(const TCHAR *data)
{
    m_cOutFile->write(data,_tcslen(data));
}

void CLogFile::PrintCurTime()
{
    TCHAR dateString[52];
    SYSTEMTIME cur;
    GetLocalTime(&cur);

    sprintf(dateString,"%d/%d/%d, %d:%d:%d ", cur.wYear, cur.wMonth,
            cur.wDay, cur.wHour, cur.wMinute, cur.wSecond);

    Output(dateString);
}

CLogFile& CLogFile::operator <<(unsigned int unVal)
{
    strstream tmp;
    tmp << unVal;
    tmp << '\0';

    TCHAR* output = tmp.str();

    Output(output);

    tmp.freeze(false);
    return *this;
}

CLogFile& CLogFile::operator <<(long lVal)
{
    strstream tmp;
    tmp << lVal;
    tmp << '\0';

    TCHAR* output = tmp.str();

    Output(output);

    tmp.freeze(false);

    return *this;
}

CLogFile& CLogFile::operator <<(const TCHAR* str)
{
    Output(str);
    return *this;
}

CLogFile& CLogFile::operator <<(TCHAR tch)
{
    TCHAR szCh[2];
    szCh[0] = tch;
    szCh[1] = '\0';
    Output(szCh);
    return *this;
}

CLogFile& CLogFile::operator <<(int nVal)
{
    strstream tmp;
    tmp << nVal;
    tmp << '\0';

    TCHAR* output = tmp.str();

    Output(output);

    tmp.freeze(false);
    return *this;
}

CLogFile& CLogFile::operator <<(unsigned long ulVal)
{
    strstream tmp;
    tmp << ulVal;
    tmp << '\0';

    TCHAR* output = tmp.str();
    Output(output);
    tmp.freeze(false);
    return *this;
}

CLogFile& CLogFile::operator <<(double dVal)
{
    strstream tmp;
    tmp << dVal;
    tmp << '\0';

    TCHAR* output = tmp.str();
    Output(output);
    tmp.freeze(false);
    return *this;
}

void CLogFile::LOGERROR(TCHAR* formatString, ...)
{
    // Insert the current time..
    PrintCurTime();
    // Parse the format string and write to the file
    if(formatString == NULL)
    {
        // No point in continuiing
        return;
    }

    va_list argList;
    // Set va_list to the beginning of optional arguments
    va_start(argList, formatString);
    TCHAR* ptr = formatString;

    while(*ptr != '\0')
    {
        TCHAR* str = NULL;
        int nInteger = 0;
        unsigned int unInt	= 0;
        long lLong = 0;
        unsigned long ulLong = 0;
        double dDoub = 0;

        if(*ptr == '%')
        {
            switch(*(ptr+1))
            {
                case 's':
                    str = va_arg(argList, TCHAR*);
                    if( NULL == str)
                    break;
                    *this << str;
                    ptr++;
                    break;

                case 'd':
                    nInteger = va_arg(argList, int);
                    *this << nInteger;
                    ptr++;
                    break;

                case 'u':
                    unInt = va_arg(argList, unsigned int);
                    *this << unInt;
                    ptr++;
                    break;

                case 'l':
                    ptr++;
                    if(*(ptr+1) == 'd')
                    {
                        lLong = va_arg(argList, long);
                        *this << lLong;
                        ptr++;
                    }
                    else if(*(ptr+1) == 'u')
                    {
                        ulLong = va_arg(argList, unsigned long);
                        *this << ulLong;
                        ptr++;
                    }
                    break;
                case 'f':
                    dDoub = va_arg(argList, double);
                    *this << dDoub;
                    ptr++;
                    break;
                default:
				*this << *ptr;
            }
        } //  if(*ptr == '%')
        else
        {
            *this << *ptr;
        }
        // Increment pointer..
        ptr++;
    }
    *this << '\n';
}

编译的时候:设置VS字符集为多字节字符集

测试代码:

#include "StdAfx.h"
#include "logfile.h"

int main()
{
    CLogFile log("lof_file.txt");
	
    log<<1;
    log<<"\n";

    log<<2.3;
    log<<"\n";

    log<<"ok";
    log<<"\n";

    log.LOGERROR("%d, %s",1,"error1");

    log.LOGERROR("%d, %s",2,"error2");

    return 0;
}

你可能感兴趣的:(windows,File,null,delete,include,output)