티스토리 뷰

Visual Studio 2012


로그를 파일로 따로 저장해보자.

로그 저장하기의 심화버전이랄까..


가변인수를 활용해서 로그 저장하기 참조

http://zadd.tistory.com/49


기존에 작성했던 함수에 FILE 포인터 변수를 추가하여 파일으로 저장까지 해보자.

기왕 저장하는거 보기 편하게 SYSTEMTIME을 활용하여 날짜도 적용한다.


1. 변수 및 함수 선언


header.h

FILE* fP;   //파일 포인터 추가
void AddLog(char* format, ...);
bool OpenFile();
void CloseFile();

파일 포인터 변수와 로그 저장 함수, 파일을 열고 닫을 함수를 준비한다.


2. 소스코드를 살펴보자


main.cpp


void AddLog(char* format, ...)
{
	char buf[512]="Result: ";
	va_list va;
	va_start(va, format);
	vsprintf_s(buf+strlen(buf), 512-strlen(buf), format, va);
	
	va_end(va);

	OpenFile();
	if(fP!=NULL)
	{
		fprintf(fP, "%s", buf);
	}
	CloseFile();
	//puts(buf);
}

기존 함수에 파일 관련 코드들을 추가했다.

루틴

1) OpenFile 함수로 파일포인터에 원하는 파일을 연다.

2) 파일이 정상적으로 열려있다면 fprintf로 파일안에 작성된 로그를 저장한다.

3) CloseFile로 열린 파일을 해제한다.


bool OpenFile()
{
	CString strDate, strDate2, strPath;
	CString strLogF;

	SYSTEMTIME st;
	GetLocalTime(&st);
	strDate.Format("%04d-%02d", st.wYear, st.wMonth);

	strPath="D:\\LogData";

	strPath = strPath + "\\" + strDate;
	CreateDirectory(strPath, NULL );

	strDate.Format("%02d", st.wDay);
	strPath = strPath + "\\" + strDate;
	CreateDirectory(strPath, NULL );

	strDate2.Format("\\%02d.txt", st.wHour);

	strDate=strPath+strDate2;

	errno_t err;
	if((err = fopen_s(&fP, strDate, "a+")) != 0)
	{
		fP = NULL;	
		return FALSE;
	}
	else
	{
		ASSERT(fP != NULL);
		setvbuf(fP, NULL, _IONBF, 0 );
	}

	return TRUE;
}

SYSTEMTIME을 활용하여 현재 해당 연도, 달, 일을 읽어올 수 있다.

CreaterDirectory함수를 활용하여 원하는 폴더를 만든 후에 그 폴더 위치에 파일을 생성후 열어놓는다.

(예제에서 로그가 성공적으로 저장되는 위치는 D:\LogData\YYYY-MM\DD\HH.txt 이다.)

ASSERT문을 사용하여 추후에 생길 버그도 대처 할수 있게 한다.

파일을 정상적으로 생성하고 열어놓았다면, setvbuf를 통해 버퍼를 만들어 대기시킨다.


void CloseFile()
{
	if(fP == NULL)
		return;
	ASSERT(fP != NULL);
	fclose(fP);
	fP=NULL;
}

열어놓은 파일을 해제한다. 


int main()
{
	int a=1, b=2;
	AddLog("%d + %d = %d", a,b,a+b);
	return 0;
}

위와 같이 한다면 생성된 파일에 사용되는 문자는

Result: 1 + 2 = 3 이 될 것이다.



댓글