(10101101)173/C, C++2008. 11. 7. 11:24

도스창에서 화면을 지워주는 명령어인 cls를 구현한 것입니다.
물론 "system("cls");"로 똑같은 기능에 구현이 가능하지만
많이 사용하게 될 경우 메모리 누수가 발생하게 됩니다.
이를 보안하기 위한  코드입니다.
하지만 이 코드는 Windows에서만 작동하고, LINUX C에서는
동작하지 않습니다. 그 이유는 텍스트 모드 창의 화면을 지우는 작업을
터미널이나 OS에 독립적으로 하는 것이 불가능하기 때문입니다.


[[Source]]

#include <stdio.h>
#include <conio.h>    // 예제 속의 getch() 함수를 위해
#include <Windows.h>

void cls(HANDLE hConsole);

int main(void)
{

puts("이런저런 문자열들...");
puts("이런저런 문자열들...");
puts("이런저런 문자열들...");
puts("");
puts("이제 화면을 지우겠습니다. 아무 키나 누르세요.");
getch();    // 화면 중지

// 현재 도스창에 대한 핸들 얻기
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

cls(hConsole);

return 0;

}

// 원본 소스: http://support.microsoft.com/kb/q99261/
// 여기서부터, 화면 지우기 함수가 시작됨

/* Standard error macro for reporting API errors */

#define PERR(bSuccess, api)
{

if(!(bSuccess))

printf("%s:Error %d from %s on line %d\n", __FILE__, GetLastError(), api, __LINE__);

}

void cls( HANDLE hConsole )
{

COORD coordScreen = { 0, 0 };    /* here's where we'll home the cursor */

BOOL bSuccess;
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */
DWORD dwConSize;                 /* number of character cells in the current buffer */

/* get the number of character cells in the current buffer */
bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );
PERR( bSuccess, "GetConsoleScreenBufferInfo" );
dwConSize = csbi.dwSize.X * csbi.dwSize.Y;

/* fill the entire screen with blanks */
bSuccess = FillConsoleOutputCharacter( hConsole, (TCHAR) ' ',
dwConSize, coordScreen, &cCharsWritten );
PERR( bSuccess, "FillConsoleOutputCharacter" );

/* get the current text attribute */
bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi );
PERR( bSuccess, "ConsoleScreenBufferInfo" );

/* now set the buffer's attributes accordingly */
bSuccess = FillConsoleOutputAttribute( hConsole, csbi.wAttributes,
dwConSize, coordScreen, &cCharsWritten );
PERR( bSuccess, "FillConsoleOutputAttribute" );

/* put the cursor at (0, 0) */
bSuccess = SetConsoleCursorPosition( hConsole, coordScreen );
PERR( bSuccess, "SetConsoleCursorPosition" );
return;

}


위의 예제를 실행하면 테스트용 문자열들이 우선 나옵니다.
아무 키나 누르면 현재 도스창 화면이 완전히 지워지고, 커서 위치도 초기화됩니다.

여기서 참고해야 할 것은
VC 2005나 그 이상 버전의 컴파일러에서는 getch() 함수를 _getch() 로 변경해 주어야 합니다. 함수명 앞에 밑줄이 붙은 _getch() 함수는 보안이 강화된 함수입니다.

출처 : http://mwultong.blogspot.com/2006/11/c-vc-cls-console-clear-screen-function.html

Posted by Special Alex