°¡º¯ Àμö ÇÔ¼ö´Â ÇÑ ¹ø È£Ãâ·Î ¿©·¯ °³ÀÇ Á¤º¸¸¦ ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ´Ù·ê ¼ö ÀÖ´Ù´Â ¸é¿¡¼ Æí¸®ÇÏ´Ù. ƯÈ÷ printf ÇÔ¼ö´Â ´Ù¾çÇÑ Å¸ÀÔÀÇ º¯¼öµéÀ» ÇѲ¨¹ø¿¡ Ãâ·ÂÇÒ ¼ö ÀÖ¾î º¯¼ö°ªÀ» È®ÀÎÇØ º¼ ¶§ ¾ÆÁÖ À¯¿ëÇÏ´Ù. ÀÌ·± ÇÔ¼ö¸¦ Á÷Á¢ ¸¸µé·Á¸é µ¶ÀÚÀûÀ¸·Î ¼½ÄÀ» Á¤ÀÇÇÏ°í ¼½Ä ¹®ÀÚ¿°ú ´ëÀÀµÇ´Â °¡º¯ Àμö¸¦ Á÷Á¢ Àд º¹ÀâÇÑ ·çƾÀ» ¸¸µé¾î¾ß Çϴµ¥ ´ÙÇàÈ÷ ÀÌ·± ÀÏÀ» ´ë½ÅÇØ ÁÖ´Â ÇÔ¼öµéÀ» ÁغñµÇ¾î ÀÖ´Ù. ´ëÇ¥ÀûÀ¸·Î ´ÙÀ½ µÎ ÇÔ¼ö¸¸ ¼Ò°³ ÇÑ´Ù.
int vprintf( const char *format, va_list argptr );
int vsprintf( char *buffer, const char *format, va_list argptr );
ÀÌ¿Ü¿¡ vscanf, vsscanf µîÀÇ ÇÔ¼öµµ Àִµ¥ ¾ËÆĺª v(Variable)·Î ½ÃÀÛÇÑ´Ù°í Çؼ ÀÌ·± ÇÔ¼öµéÀ» v°è¿ÀÇ ÇÔ¼ö¶ó°í ÇÑ´Ù. À§ µÎ ÇÔ¼öµéÀº printf, sprintf¿Í µ¿ÀÏÇÑ ±â´ÉÀ» ¼öÇàÇϴµ¥ °¡º¯ Àμö¸¦ Á÷Á¢ ³ª¿ÇÏ´Â ´ë½Å °¡º¯ Àμö°¡ ½ÃÀ۵Ǵ ¹øÁö¸¸À» Àμö·Î ÃëÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. Áï ½ÇÁ¦·Î °¡º¯ Àμö¸¦ ÃëÇÏÁö´Â ¾ÊÀ¸¸ç °¡º¯ Àμö¸¦ ÃëÇÏ´Â ´Ù¸¥ ÇÔ¼öÀÇ ³»ºÎ¿¡¼ printf ÀÇ ¼½ÄÀ» Çؼ®ÇÏ°í Àû¿ëÇÏ´Â ÀÏÀ» ´ë½ÅÇÑ´Ù.
ÀÌ µÎ ÇÔ¼ö¸¦ »ç¿ëÇϸé printfó·³ µ¿ÀÛÇÏ´Â ºñ½ÁÇÑ ÇÔ¼ö¸¦ Á÷Á¢ ¸¸µé¾î ¾µ ¼ö ÀÖ´Ù. ´ÙÀ½ ÇÔ¼ö´Â C/C++¾ð¾îÀÇ °¡º¯ Àμö ±â´ÉÀ» È°¿ëÇÏ¿© ½ÇÇàÁß¿¡ º¯¼ö°ªÀ» µð¹ö°Å·Î ½Ç½Ã°£ È®ÀÎÇØ º¸´Â ±â´ÉÀ» Á¦°øÇÑ´Ù.
void CustomTrace(char *format, ...)
{
char buf[1024];
va_list marker;
va_start( marker, format );
vsprintf(buf,format,marker);
OutputDebugString(buf);
}
OutputDebugStringÀ̶ó´Â API ÇÔ¼ö°¡ »ç¿ëµÇ¾ú´Âµ¥ ÀÌ ÇÔ¼ö´Â ÁÖ¾îÁø ¹®ÀÚ¿À» µð¹ö±ë âÀ¸·Î Ãâ·ÂÇÑ´Ù. ºñÁÖ¾ó C++ÀÇ °æ¿ì Output À©µµ¿ì¿¡ ÀÌ ÇÔ¼öÀÇ Ãâ·Â ³»¿ëÀÌ ³ªÅ¸³ª¹Ç·Î ½ÇÇàÁß¿¡ º¯¼ö°ªÀÇ º¯È¸¦ È®ÀÎÇϰųª ƯÁ¤ ÇÔ¼öÀÇ È£Ãâ ½ÃÁ¡, ȸ¼ö µîÀ» ¾Ë°í ½ÍÀ» ¶§ Áß°£ Áß°£¿¡ ÀÌ ÇÔ¼ö¸¦ »ðÀÔÇØ ³õÀ¸¸é µÈ´Ù. »ç¿ë¿¹¸¦ µéÀÚ¸é ´ÙÀ½°ú °°´Ù.
CustomTrace("º¯¼ö a=%d, º¯¼ö f=%f\n",a,f);
CustomTrace("ÇÔ¼ö func°¡ %d¹ø° È£ÃâµÇ¾úÀ½",count++);
Å×Æ®¸®½º ¿¹Á¦ÀÇ ´ÙÀ½ À§Ä¡¿¡ CustomTrace ÇÔ¼ö È£ÃâÀ» »ðÀÔÇØ ³õÀ¸¸é º®µ¹ÀÌ ÇÑľ¿ ¿òÁ÷ÀÏ ¶§¸¶´Ù ÁÖ¿ä Àü¿ªº¯¼ö°ªÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
for (;2;) {
CustomTrace("º®µ¹=%d,ȸÀü=%d,À§Ä¡=(%d,%d)\n",brick,rot,nx,ny);
CustomTrace ÇÔ¼öÀÇ ³»ºÎ´Â ¹«Ã´ °£´ÜÇÏ´Ù. va_start·Î ù ¹ø° °¡º¯ ÀμöÀÇ ¹øÁö¸¦ ±¸ÇÑ ÈÄ ±× ¹øÁö¸¦ ¼½Ä ¹®ÀÚ¿°ú ÇÔ²² vsprintf ÇÔ¼ö·Î ³Ñ±â±â¸¸ ÇÏ¸é µÈ´Ù. OutputDebugString ÇÔ¼ö¸¦ Á÷Á¢ »ç¿ëÇÒ ¼ö ÀÖÁö¸¸ ÀÌ ÇÔ¼ö´Â ´Ü¼øÇÑ ¹®ÀÚ¿¸¸ Ãâ·ÂÇÒ ¼ö Àִµ¥ ºñÇØ CustomTrace´Â ¼½ÄÈµÈ ¹®ÀÚ¿À» Ãâ·ÂÇÒ ¼ö ÀÖ¾î ÈξÀ ´õ Æí¸®ÇÏ´Ù.
´ÙÀ½Àº ¶È°°Àº ¸ñÀûÀÇ Á» ´õ º¹ÀâÇÑ ÇÔ¼ö¸¦ ¼Ò°³ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â Win32 ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö±îÁö »ç¿ëÇÏ°í Àֱ⠶§¹®¿¡ ÇöÀç ´Ü°è¿¡¼ ºÐ¼®ÇØ º¸±â´Â ¾î·Á¿ì¹Ç·Î Â÷ÈÄ¿¡ API¸¦ ¹è¿î ÈÄ¿¡ Á÷Á¢ ºÐ¼®ÇØ º¸±â ¹Ù¶õ´Ù.
#define DEBUGLOGFILE "c:\\DebugLog.txt"
void WriteLogFile(char *strLog,...)
{
HANDLE hLog;
static int count=0;
DWORD dwWritten;
char szLog[1024];
char strLog2[1024];
va_list marker;
SYSTEMTIME st;
// °¡º¯ Àμö¸¦ Á¶¸³ÇÑ´Ù.
va_start( marker, strLog );
vsprintf(szLog,strLog,marker);
// óÀ½ È£ÃâµÉ ¶§ ÆÄÀÏÀ» ¸¸µé°í ÀÌÈĺÎÅÍ´Â ÆÄÀÏÀ» ¿±â¸¸ ÇÑ´Ù.
if (count == 0) {
hLog=CreateFile(DEBUGLOGFILE,GENERIC_WRITE,0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
} else {
hLog=CreateFile(DEBUGLOGFILE,GENERIC_WRITE,0,NULL,
OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
}
// ·Î±×¿¡ ÇöÀç ½Ã°£°ú Ä«¿îÅ͸¦ ±â·ÏÇÑ´Ù.
GetLocalTime(&st);
wsprintf(strLog2,"Ä«¿îÅÍ=%06d(%d:%d:%d:%d) %s\r\n",count++,
st.wHour,st.wMinute,st.wSecond,st.wMilliseconds,szLog);
SetFilePointer(hLog,0,NULL,FILE_END);
WriteFile(hLog,strLog2,strlen(strLog2),&dwWritten,NULL);
CloseHandle(hLog);
}
»ç¿ëÇÏ´Â ¹æ¹ýÀº printf³ª CustomTrace¿Í µ¿ÀÏÇÏ´Ù. ´Ü, Â÷ÀÌÁ¡À̶ó¸é Á¶¸³µÈ ¼½Ä ¹®ÀÚ¿ÀÌ È¸éÀ̳ª µð¹ö±ë âÀ¸·Î Ãâ·ÂµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó ÁöÁ¤ÇÑ ÆÄÀÏ¿¡ ±â·ÏµÈ´Ù´Â °Í°ú Ä«¿îÆ®, È£Ãâ ½ÃÁ¡ÀÇ ½Ã°£ µîÀ» °°ÀÌ ±â·ÏÇÑ´Ù´Â Á¡ÀÌ´Ù. ¸ÖƼ ½º·¹µå ȯ°æÀ̳ª ½Ç½Ã°£À¸·Î µ¿ÀÛÇÏ´Â ÇÁ·Î±×·¥À» µð¹ö±ëÇÒ ¶§´Â µð¹ö°Å¸¦ ¾²±â ½±Áö ¾Ê±â ¶§¹®¿¡ ¸ðµç µð¹ö±ë Á¤º¸¸¦ ÆÄÀÏ¿¡ ÀÏ´Ü ±â·ÏÇÑ ÈÄ ÆÄÀÏ¿¡ ³²°ÜÁø ·Î±×(log) Á¤º¸¸¦ ºÐ¼®ÇÏ´Â °ÍÀÌ ´õ È¿À²ÀûÀÌ´Ù.
ÀÌ·² ¶§ ÀÌ ÇÔ¼ö°¡ ¾ÆÁÖ À¯¿ëÇÏ°Ô »ç¿ëµÇ¸ç ½ÇÀü¿¡¼ ¿©·¯ ¹ø È°¿ëÇß¾ú´Âµ¥ È¿°ú°¡ ¾ÆÁÖ ÁÁ¾Ò´Ù. ¸±¸®Áî ¸ðµå¿¡¼¸¸ Áõ»óÀÌ ³ªÅ¸³¯ ¶§¶óµç°¡ µð¹ö°Å¸¦ ¾µ ¼ö ¾ø´Â ¼ºñ½º·ùÀÇ ÇÁ·Î±×·¥À» µð¹ö±ëÇÒ ¶§ ÃÖÈÄÀÇ µð¹ö±ë ¹æ¹ýÀ¸·Î ƯÈ÷ ¸¹Àº È°¾àÀ» ÇÑ´Ù. ¹°·Ð ÀÌ ÇÔ¼öµµ ´õ °³¼±ÇØ º¼ ¿©Áö°¡ ¸¹Àºµ¥ ´ÙÀ½¿¡ ½Ç·ÂÀÌ ´Ã¸é Á÷Á¢ °³¼±ÇØ º¸±â ¹Ù¶õ´Ù.