'유니코드'에 해당되는 글 2건

  1. 2007/12/14 로그클래스
  2. 2007/09/11 sprintf 와 wsprintf 이야기 (2)

로그클래스

from Study/C++ 2007/12/14 18:23 view 34896

1. Log.h ( 로그파일, 출력을 도와주는 클래스 )

/** \file Log.h
**    \date  2007/12/10
**    \author kimjunju@hotmail.com
**/


#pragma once 

/**    \class    CLog
    \brief    시간을 기준으로 로그를 남긴다.
    \remark    static 멤버함수로 선언하여 객체없이 함수를 이용가능하다.
*/


/** \ingroup UTIL */

class CLog
{
public:
    static BOOL    WriteLog(LPTSTR data, ...)
    {
        _wsetlocale(LC_ALL, _T("korean"));  // 한글을 출력하기 위한 설정.

        SYSTEMTIME    SystemTime;
        TCHAR        CurrentDate[32]                    = {0,};
        TCHAR CurrentFileName[MAX_PATH] = {0,};
        FILE* FilePtr = NULL;
        TCHAR        DebugLog[MAX_BUFFER_LENGTH]        = {0,};

        va_list        ap;
        TCHAR        Log[MAX_BUFFER_LENGTH]    = {0,};

        va_start(ap, data);
        _vstprintf(Log, data, ap);
        va_end(ap);

        GetLocalTime(&SystemTime);
        _sntprintf(CurrentDate, 32, _T("%d-%d-%d %d:%d:%d"),
            SystemTime.wYear,
            SystemTime.wMonth,
            SystemTime.wDay,
            SystemTime.wHour,
            SystemTime.wMinute,
            SystemTime.wSecond);

        _sntprintf(CurrentFileName, MAX_PATH, _T("LOG_%d-%d-%d %d.log"),
            SystemTime.wYear,
            SystemTime.wMonth,
            SystemTime.wDay,
            SystemTime.wHour);

        FilePtr = _tfopen(CurrentFileName, _T("a"));
        if (!FilePtr)
            return FALSE;

        _ftprintf(FilePtr, _T("[%s] %s\n"), CurrentDate, Log);
        _sntprintf(DebugLog, MAX_BUFFER_LENGTH, _T("[%s] %s\n"), CurrentDate, Log);

        fflush(FilePtr);
        fclose(FilePtr);

        OutputDebugString(DebugLog);
        _tprintf(_T("%s"), DebugLog);

        return TRUE;
    }

    static BOOL    WriteLogNoDate(LPTSTR data, ...)
    {
        _wsetlocale(LC_ALL, _T("korean"));

        SYSTEMTIME    SystemTime;
        TCHAR        CurrentDate[32]                    = {0,};
        TCHAR        CurrentFileName[MAX_PATH]        = {0,};
        FILE*        FilePtr                            = NULL;
        TCHAR        DebugLog[MAX_BUFFER_LENGTH]        = {0,};

        va_list        ap;
        TCHAR        Log[MAX_BUFFER_LENGTH]    = {0,};

        va_start(ap, data);
        _vstprintf(Log, data, ap);
        va_end(ap);

        GetLocalTime(&SystemTime);
        _sntprintf(CurrentDate, 32, _T("%d-%d-%d %d:%d:%d"),
            SystemTime.wYear,
            SystemTime.wMonth,
            SystemTime.wDay,
            SystemTime.wHour,
            SystemTime.wMinute,
            SystemTime.wSecond);

        _sntprintf(CurrentFileName, MAX_PATH, _T("LOG_%d-%d-%d %d.log"),
            SystemTime.wYear,
            SystemTime.wMonth,
            SystemTime.wDay,
            SystemTime.wHour);

        FilePtr = _tfopen(CurrentFileName, _T("a"));
        if (!FilePtr)
            return FALSE;

        _ftprintf(FilePtr, _T("%s"), Log);
        _sntprintf(DebugLog, MAX_BUFFER_LENGTH, _T("%s"), Log);

        fflush(FilePtr);

        fclose(FilePtr);

        OutputDebugString(DebugLog);
        _tprintf(_T("%s"), DebugLog);

        return TRUE;
    }
};
Tag |

sprintf 와 wsprintf 이야기

from Study/API 2007/09/11 20:23 view 75406
귓동냥으로 wsprintf()의 w가 windows라는것을 알았기 때문에, 윈도우즈에서 프로그래밍할때에는 막연히 wsprintf()를 썼었는데, 오늘 관련 자료를 찾아보면서 보다 정확히 알게 되었다.

간략하게 정리하면
sprintf()는 CRT 라이브러리를 사용하는 함수
wsprintf()는 플랫폼 SDK에서 제공하는 함수, 단 실수(float)형의 사용은 안된다.
/////////////////////////////////////////////////////////////////////////////////////////////
sprintf 를 사용하려면  #include <stdio.h> 가 필요합니다.

이는 보통
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop 식으로 쓰이게 되죠.

그런데 왜 vcl에서는 sprintf 를 포함하지 않았는지 궁금했었는데... wsprintf 가 있기 때문이었습니다.

wsprintf 는
#include <stdio.h>
없이 사용가능한 WIN32 API 로,  일반 ANSI코드과 유니코드 사용 프로그램에
공히 사용할수 있는 문자열 합성 함수입니다.

유니코드를 사용하지 않는 프로그램이면 그냥 wsprintf 를 sprintf 대신 사용하면 됩니다.
유니코드를 사용하는 프로그램이면 역시 wsprintf 를 그냥 사용하면 됩니다.

유니코드를 사용할 경우는 문자열은 L"문자열"; 식으로 유니코드로 표현되어야 하며
char * 대신 wchat_t *  형이 사용되어야 합니다.

그래서 표준적으로 유니코드 사용프로그램과 일반 프로그램에 공히 하나의 코드로 처리하기 위해
컴파일러는 TCHAR 형과 TEXT 매크로를 제공합니다.

가령 OnCreate 이벤트에 다음과 같은 코딩이 가능합니다.
{
TCHAR  buf[100];
wsprintf(buf, TEXT("캡션 메시지: %s"), TEXT("안녕하세요. C++빌더입니다."));
Caption = buf;
}
이 코드는 ANSI형이나 유니코드형 프로그램 양쪽에서 안전하게 동작합니다.
TEXT 매크로 와 __TEXT 매크로는 동일합니다.

Project Option->Directorys...->Conditional defines ; 에 UNICODE 또는 _UNICODE 를 넣어주면
유니코드모드로 컴파일하게 되는데, 이 경우 안전하게 유니코드모드로 컴파일되게 합니다.

프로그래밍할때 아예 습관을 char 대신 TCHAR 으로 하고
"문자열" 대신 TEXT("문자열") 을 쓰는 것도 좋을 것입니다.
Tag | ,