콘솔을 어떻게 지울 수 있습니까?


92

제목에서와 같이. C ++에서 콘솔을 어떻게 지울 수 있습니까?


어떤 OS에서? 한 가지 예를 들어, Linux와 Windows에서는 상당히 다릅니다. Windows 용으로 원하는 경우 다음을 참조하십시오. stackoverflow.com/questions/5866529/…
Jerry Coffin

여러 줄을 인쇄 한 다음 지우려고합니까, 아니면 각 줄 후에 지우려고합니까?
jpm

1
가끔 콘솔보기를 재설정하고 싶습니다. 수백만 개의 줄 바꿈으로 콘솔을 스팸하고 싶지 않습니다.
Thomas B

콘솔 창 핸들을 사용하여 C 에서이 작업을 수행하는 방법을 물었습니다 . 이것이 제가받은 대답 입니다. 다행히도 귀하의 사례에 도움이됩니다.
Agi Hammerthief

답변:


71

순수 C ++ 용

당신은 할 수 없습니다. C ++에는 콘솔 개념조차 없습니다.

프로그램은 프린터로 인쇄하거나 파일로 직접 출력하거나 다른 프로그램의 입력으로 리디렉션 될 수 있습니다. C ++에서 콘솔을 지울 수 있다고해도 이러한 경우는 훨씬 더 복잡해집니다.

comp.lang.c ++ FAQ에서 다음 항목을 참조하십시오.

OS 별

프로그램에서 콘솔을 지우는 것이 여전히 타당하고 운영 체제 별 솔루션에 관심이 있다면 해당 솔루션이 존재합니다.

Windows의 경우 (태그에서와 같이) 다음 링크를 확인하십시오.

편집 : system("cls");Microsoft가 그렇게 말했기 때문에 이전에을 사용하여 언급 한이 답변 입니다. 그러나 이것은 안전한 일이 아니라는 의견에서 지적되었습니다 . 이 문제로 인해 Microsoft 문서에 대한 링크를 제거했습니다.

라이브러리 (다소 이식 가능)

ncurses는 콘솔 조작을 지원하는 라이브러리입니다.


6
@Alf : 나는 그것을 MS 기사에서 붙여 넣었다. 그래서 나는 그들을 비웃는 다.;) 나는 그것을 고칠 것이다.
Merlyn Morgan-Graham

11
출처는 중요하지 않습니다. 컴파일도하지 않는 코드 (g ++ 사용)는 좋지 않습니다. 그러나 당신이 그것을 고쳤 기 때문에 나는 반대표를 제거했습니다. :-)
건배와 hth. -Alf

1
@YoushaAleayoub은 사용을 제안하는 MS 링크를 제거하기 위해 답변을 편집하고 system그 이유를 설명하는 기사에 링크를 추가했습니다.
Merlyn Morgan-Graham

53

Windows의 경우 콘솔 API를 통해 :

void clear() {
    COORD topLeft  = { 0, 0 };
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO screen;
    DWORD written;

    GetConsoleScreenBufferInfo(console, &screen);
    FillConsoleOutputCharacterA(
        console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    FillConsoleOutputAttribute(
        console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
        screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    SetConsoleCursorPosition(console, topLeft);
}

가능한 모든 오류를 기꺼이 무시하지만 콘솔 지우기입니다. 아니 같은 system("cls")더 나은 핸들 오류가 발생합니다.

* nixes의 경우 일반적으로 ANSI 이스케이프 코드를 사용할 수 있으므로 다음과 같습니다.

void clear() {
    // CSI[2J clears screen, CSI[H moves the cursor to top-left corner
    std::cout << "\x1B[2J\x1B[H";
}

system이것을 사용 하는 것은 추악합니다.


6
"이를 위해 시스템을 사용하는 것은 추악합니다." - 왜? 물론이 :) 나에게 청소기를 찾습니다
Merlyn 모건 - 그레이엄에게

17
@ MerlynMorgan-Graham : 혹독한 콘솔을 지우는 쉘 프로세스를 생성합니다. 어떤면에서 그게 깨끗한 해결책입니까? : P stdout에 쓰는 대신 echovia system()를 사용하는 것과 같습니다 .
Cat Plus Plus

1
한 라이너 FTW! ;) 예, 나는 우스꽝 스럽습니다. 쉘 프로세스를 생성한다는 사실은 답변에 대한 좋은 정보입니다. * nix 버전의 경우 +1.
Merlyn Morgan-Graham


1
아카이브가 필요하지 않습니다. jdebp.eu./FGA/clearing-the-tui-screen.html#CLS 가 존재합니다.
JdeBP

20

Linux / Unix 및 기타 일부의 경우 (10 TH2 이전의 Windows에는 해당되지 않음) :

printf("\033c");

터미널을 재설정합니다.


14

바퀴를 재발 명하지 않아도되는 가장 쉬운 방법입니다.

void Clear()
{
#if defined _WIN32
    system("cls");
#elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
    system("clear");
#elif defined (__APPLE__)
    system("clear");
#endif
}

8

창 콘솔에 여러 줄을 출력하는 것은 쓸모가 없습니다. 단지 빈 줄을 추가합니다. 슬프게도 방법은 창에 따라 다르며 conio.h (및 clrscr ()가 존재하지 않을 수 있으며 표준 헤더도 아님) 또는 Win API 메서드를 포함합니다.

#include <windows.h>

void ClearScreen()
  {
  HANDLE                     hStdOut;
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  DWORD                      count;
  DWORD                      cellCount;
  COORD                      homeCoords = { 0, 0 };

  hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
  if (hStdOut == INVALID_HANDLE_VALUE) return;

  /* Get the number of cells in the current buffer */
  if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return;
  cellCount = csbi.dwSize.X *csbi.dwSize.Y;

  /* Fill the entire buffer with spaces */
  if (!FillConsoleOutputCharacter(
    hStdOut,
    (TCHAR) ' ',
    cellCount,
    homeCoords,
    &count
    )) return;

  /* Fill the entire buffer with the current colors and attributes */
  if (!FillConsoleOutputAttribute(
    hStdOut,
    csbi.wAttributes,
    cellCount,
    homeCoords,
    &count
    )) return;

  /* Move the cursor home */
  SetConsoleCursorPosition( hStdOut, homeCoords );
  }

POSIX 시스템의 경우 더 간단합니다. ncurses 또는 터미널 기능을 사용할 수 있습니다.

#include <unistd.h>
#include <term.h>

void ClearScreen()
  {
  if (!cur_term)
    {
    int result;
    setupterm( NULL, STDOUT_FILENO, &result );
    if (result <= 0) return;
    }

  putp( tigetstr( "clear" ) );
  }

5
// #define _WIN32_WINNT 0x0500     // windows >= 2000 
#include <windows.h> 
#include <iostream>

using namespace std; 

void pos(short C, short R)
{
    COORD xy ;
    xy.X = C ;
    xy.Y = R ;
    SetConsoleCursorPosition( 
    GetStdHandle(STD_OUTPUT_HANDLE), xy);
}
void cls( )
{
    pos(0,0);
    for(int j=0;j<100;j++)
    cout << string(100, ' ');
    pos(0,0);
} 

int main( void )
{
    // write somthing and wait 
    for(int j=0;j<100;j++)
    cout << string(10, 'a');
    cout << "\n\npress any key to cls... ";
    cin.get();

    // clean the screen
    cls();

    return 0;
}

3

화면을 지우려면 먼저 모듈을 포함해야합니다.

#include <stdlib.h>

이것은 Windows 명령을 가져옵니다. 그런 다음 '시스템'기능을 사용하여 배치 명령 (콘솔 편집)을 실행할 수 있습니다. C ++의 Windows에서 화면을 지우는 명령은 다음과 같습니다.

system("CLS");

그러면 콘솔이 지워집니다. 전체 코드는 다음과 같습니다.

#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
system("CLS");
}

그게 전부입니다! 행운을 빕니다 :)


3
system ( "cls")은이 문제에 대한 휴대용 솔루션이 아니지만 Windows 시스템에서 작동합니다.
CMS_95

4
그것은 "모듈"이 아닙니다. C ++에는 "모듈"이 없습니다. 또한 stdlib.hC 표준에 의해 지정되며 "Windows 명령 가져 오기"와는 관련이 없으며 실제로 Windows 자체와도 관련이 없습니다. 그 nitpicking 외에는 괜찮습니다.
궤도에서 가벼운 경주

3

Windows에서 :

#include <cstdlib>

int main() { 
    std::system("cls");
    return 0;
}

Linux / Unix :

#include <cstdlib>

int main() { 
    std::system("clear");
    return 0;
}

2

system("cls")화면을 지우는 데 사용 :

#include <stdlib.h>

int main(void)
{
    system("cls");
    return 0;
}

2
이미 받아 들여진 답변에 언급되었습니다. 여기에 새로운 정보가 없습니다.
Dialecticus

그런 다음 cout / wcout을 제거하고 단순히 system ( "echo"+ 출력)으로 파이프를 연결합니다.
Tanveer Badar

2

화면을 지우는 데 도움이 될 수있는 Windows 기능에 액세스 할 수 없기 때문에 MAC에서보기에는 어렵습니다. 가장 좋은 방법은 터미널이 지워질 때까지 반복하고 행을 추가 한 다음 프로그램을 실행하는 것입니다. 그러나 이것을 주로 자주 사용하면 효율적이거나 메모리 친화적이지 않습니다.

void clearScreen(){
    int clear = 5;
    do {
        cout << endl;
        clear -= 1;
    } while (clear !=0);
}

2

Windows에는 여러 옵션이 있습니다.

  1. clrscr () (헤더 파일 : conio.h)

  2. system ( "cls") (헤더 파일 : stdlib.h)

Linux에서는 system ( "clear") 사용 (Header File : stdlib.h)


system () 호출은 보안 문제가 될 수 있습니다.
John Doe

0

다음은이를 수행하는 간단한 방법입니다.

#include <iostream>

using namespace std;

int main()
{
    cout.flush(); // Flush the output stream
    system("clear"); // Clear the console with the "system" function
}

-1

사용 System :: Console :: Clear ();

그러면 버퍼가 비워집니다.


3
[오류] '시스템'이 선언되지 않았습니다.
LoveToCode

6
이것은 C ++ / CLI (일명 .NET C ++) 용입니다
FryGuy 2015

-1
#include <cstdlib>

void cls(){
#if defined(_WIN32) //if windows
    system("cls");

#else
    system("clear");    //if other
#endif  //finish

}

어디에서나 cls () 호출


이것은 OP가 찾고있는 것이 아닙니다. 질문에 추가 된 설명을 읽으십시오.
Agi Hammerthief

-2

system ( "")을 통해 운영 체제의 clear console 메서드를 사용할 수 있습니다.
Windows의 경우 system ( "cls"); 예를 들어
다른 운영 체제에 대해 세 가지 다른 코드를 릴리스하는 대신. os가 실행되는 것을 얻는 방법을 만드십시오.
고유 한 시스템 변수는 #ifdef와 함께 존재하는 경우는 감지하여이 작업을 수행 할 수 있습니다
예를 들어,

enum OPERATINGSYSTEM = {windows = 0, mac = 1, linux = 2 /*etc you get the point*/};

void getOs(){
    #ifdef _WIN32
        return OPERATINGSYSTEM.windows
    #elif __APPLE__ //etc you get the point

    #endif
}

int main(){
    int id = getOs();
    if(id == OPERATINGSYSTEM.windows){
        system("CLS");
    }else if (id == OPERATINGSYSTEM.mac){
        system("CLEAR");
    } //etc you get the point

}

-2

편집 : 완전히 다시 질문

어떤 시스템에 있는지 테스트하고 시스템에 따라 시스템 명령을 보내십시오. 이것은 컴파일 타임에 설정되지만

#ifdef __WIN32
    system("cls");
#else
    system("clear"); // most other systems use this
#endif

이것은 완전히 새로운 방법입니다!


3
그것을하는 아주 나쁜 방법입니다. 또한 콘솔을 지우는 것이 아니라 빈 줄만 추가합니다. 도움이되지 않습니다.
비슈누 나랑

상해에 대한 모욕을 추가 cout하기 위해 파일로 리디렉션되었을 수 있습니다. 그렇다면 콘솔에 대한 개념이 전혀 없습니다.
Tanveer Badar

-3

사용 : clrscr ();

#include <iostream>
using namespace std;
int main()
      {           
         clrscr();
         cout << "Hello World!" << endl;
         return 0;
      }

3
"이전에는 볼랜드 C 컴파일러에서 <conio.h>의 함수였습니다. C ++ 표준 함수가 아닙니다." stackoverflow.com/a/930141/1058115
cojack

-7

가장 쉬운 방법은 스트림을 여러 번 플러시하는 것입니다 (이상적으로는 가능한 콘솔보다 더 큼). 1024 * 1024는 콘솔 창이 결코 될 수없는 크기 일 것입니다.

int main(int argc, char *argv)
{
  for(int i = 0; i <1024*1024; i++)
      std::cout << ' ' << std::endl;

  return 0;
}

이것의 유일한 문제는 소프트웨어 커서입니다. 플랫폼 / 콘솔에 따라 깜박이는 것 (또는 깜박이지 않는 것)은 콘솔의 상단이 아니라 콘솔의 끝에 있습니다. 그러나 이것은 희망적으로 문제를 유발해서는 안됩니다.


2
이 대답은 일반적인 실수 입니다.
JdeBP 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.