티스토리 뷰

Programming/C+±

refresh in console program

BaeMinCheon 2018. 3. 11. 14:14

C&C++ Note #002


콘솔 프로그램의 화면 갱신


문제

  • 프로그램의 규모가 커짐에 따라 출력문이 많아질 경우, 출력창이 지저분해지기 쉬움
  • 한 번에 하나의 화면만 보여줘야할 경우

해결

  • system("cls") : stdlib.h의 system() 사용
    • 해당 코드 실행시, 출력창에 있던 이전 출력들을 지우고 좌상단으로 커서가 이동됨
  • 줄바꿈 반복함수 : stdio.h의 printf() 또는 iostream의 cout 사용
    • 글꼴 설정 및 출력창 크기 등에 따라 다소 차이가 있겠지만, 줄바꿈('\n'을 출력하는 것)을 100번 정도 수행하면 기존 화면을 숨기는 것이 충분히 가능하다. 즉, 줄바꿈을 100번 정도 수행하는 함수를 작성하여 이를 활용하는 경우임 (하단의 코드 참조)
// using printf()
void clearScreen()
{
	for(int i = 0; i < 100; ++i)
	{
		printf("\n");
	}
}

// using cout
void clearScreen()
{
	for(int i = 0; i < 100; ++i)
	{
		std::cout << std::endl;
	}
}
  • WinAPI 활용함수 : Windows.h의 구조체와 함수들을 사용
    • 콘솔창 크기만큼을 공백으로 채운 뒤, 커서 위치를 좌상단으로 옮겨 해결함 (하단의 코드 참조)
void clearScreen()
{
	DWORD
		n,
		size;
	COORD coord = { 0, 0 };
	CONSOLE_SCREEN_BUFFER_INFO csbi;

	HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
	GetConsoleScreenBufferInfo(h, &csbi);

	size = csbi.dwSize.X * csbi.dwSize.Y;

	FillConsoleOutputCharacter(h, TEXT(' '), size, coord, &n);
	GetConsoleScreenBufferInfo(h, &csbi);
	FillConsoleOutputAttribute(h, csbi.wAttributes, size, coord, &n);

	SetConsoleCursorPosition(h, coord);
}

※ 도움말

  • DWORD : unsigned long과 동일한 자료형
  • COORD : 콘솔 화면에서의 좌표값을 저장하는 자료형

한계

  • system("cls")
    • C&C++ Note #001에서 언급했듯이, system() 자체의 단점이 존재하므로 함부로 사용하는 것은 지양할 것
  • 줄바꿈 반복함수
    • 커서를 좌상단에 위치시키기 어려움(여러 요소에 영향을 받기 때문에). 실제로 이 방법을 사용해보면, 주로 좌하단에 커서가 위치하게 됨
  • WinAPI 활용함수
    • 윈도우즈에 대해서만 동작하기 때문에, 이식성이 떨어짐

결론

  • 상황에 따라 줄바꿈 반복함수 또는 WinAPI 활용함수를 사용하는 것이 좋겠다.


'Programming > C+±' 카테고리의 다른 글

cpp-lib-and-dll-on-visual-studio (2/2)  (0) 2019.03.17
cpp-lib-and-dll-on-visual-studio (1/2)  (0) 2019.02.23
SetCapture() GetCapture() ReleaseCapture()  (2) 2018.04.01
pause in console program  (0) 2018.03.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함