2014-09-14 5 views
1

터미널에서 실행중인 일부 응용 프로그램은 출력을 지울 수 있습니다. 예 : 대기하라는 메시지가 표시되면 길이가 서로 다른 일련의 점들이 표시됩니다.C에서 터미널에서 지우기 출력을 구현하는 방법은 무엇입니까?

C에서 구현되는 터미널에서 출력을 지우는 방법은 무엇입니까? 역방향 피드로 처리됩니까?

프로그램은 현재 줄의 이전 문자 만 지울 수 있으며 stdout의 이전 줄의 문자는 지울 수 있습니까?

감사합니다.

+3

글쎄, C는 화면의 개념을 이해하지 못한다. 따라서 모든 코드는 이식성이 떨어집니다. 필요에 따라 conio.h 또는 curses를 살펴 보시겠습니까? 다음에서 복사 : http://stackoverflow.com/questions/2347770/how-do-you-clear-console-screen-in-c – Igor

+1

나는 다음과 같은 것을 찾고 있다고 생각합니다. http://stackoverflow.com/questions/2208126/erasing-terminal-output-on-linux 다음 코드는 찾고있는 코드입니다. http://stackoverflow.com/questions/1348563/clearing-output-of-a-terminal-program-linux-c-c – maisheri

+0

글쎄, 터미널 유형에 따라 다릅니다. 어떤 유형은 "파괴적인"백 스페이스를 할 수 있고, 다른 것들은 커서를 왼쪽으로 치우거나 + 문자를 삭제할 필요가 있거나 심지어 CR + 전체 라인을 다시 쓸 수도 있습니다. 자세한 내용은 termcap/terminfo를보세요 ... – wildplasser

답변

3

터미널에 따라 다릅니다.

Windows의 COMSPEC 셸 (DOS 프롬프트 또는 command.com이라고도 함)은 C로 커서를 제어하는 ​​API를 제공합니다. 나는 윈도우 프로그래밍을하지 않았으므로 그것에 대해 많이 말할 수는 없다.

대부분의 다른 터미널 (특히 unixen)은 VT100 직렬 터미널 (VT100 터미널은 서버와 통신하기 위해 모뎀이나 직렬 포트에 연결 한 물리적 장치, 모니터 및 키보드)과 유사한 프로토콜을 에뮬레이트합니다.

VT100 터미널에서 캐리지 리턴과 줄 넘김은 별도의 명령으로 1 바이트입니다. 캐리지 리턴 명령은 커서를 행의 시작 부분으로 설정합니다. 줄 바꿈 명령은 커서를 한 줄 아래로 이동하지만 커서를 줄의 시작 부분으로 가져 오지는 않습니다. unixen에있는 대부분의 셸은 줄 바꿈 후에 자동으로 캐리지 리턴을 삽입하지만 캐리지 리턴 후에 줄 바꿈을 거의 삽입하지 않습니다.

printf("\rprogress: %d percent ", x); 

참고 줄 끝에 여분의 공간이 지식으로

은 간단한 구현은 출력 캐리지 리턴 전체 라인을 다시 인쇄이다. "\r"을 인쇄해도 선이 지워지지 않으므로 이전 선을 통해 다시 인쇄하면 화면에 이전 문자열 중 일부가 남을 수 있습니다. 여분의 공백은 이전 행의 나머지 부분을 시도하고 지우는 데 사용됩니다.

"VT100 escape secquence"으로 검색하면 현재 줄을 지우거나 텍스트의 색을 변경하거나 화면의 특정 행/열로 이동하는 등의 작업을 수행 할 수있는 명령을 찾을 수 있습니다. 가장 많이 사용되는 VT100 시퀀스는 다음과 같습니다. 컬러 텍스트를 출력합니다. 그러나 당신은 또한 그들과 함께 다른 일을 할 수 있습니다.

\033[2K
printf("\033[2K\rprogress: %d percent", x); 

현재 라인 (ESC [2K)를 삭제하는 이스케이프 시퀀스입니다 :

다음의 간단한 구현은 깔끔하게 라인을 삭제하고 다시 인쇄하는 것입니다.

여기에서 원하는 경우 더 창의적으로보실 수 있습니다. 커서 저장/복원 명령을 줄 끝까지 지우기 명령과 함께 사용하면 전체 행 대신 업데이트하려는 부분 만 지울 수 있습니다. goto 명령을 사용하여 화면의 특정 위치에 커서를 놓아 텍스트 등을 업데이트 할 수 있습니다.

VT102 시퀀스 또는 일부 전체 ANSI 이스케이프 시퀀스와 같은 고급 기능은 일반적으로 휴대용 가로 터미널 (터미널에 의해 나는 껍질을 의미하지는 않습니다, 나는 터미널 의미 : rxvt, xterm, 리눅스 터미널, 하이퍼 터미널 (윈도우) 등).

이식성 (및/또는 정상 API)을 원한다면 curses 또는 ncurses 라이브러리를 사용해야합니다.

어떻게 완료되었는지 알고 싶다면 그것이 어떻게 완료되었는지 알고 싶습니다. 그냥 특수 서식이 지정된 문자열을 화면에 출력하는 것입니다 (COMSPEC 셸 제외). 종류는 HTML이지만 구식입니다.

+0

이것은 C의 특정 사항이 아니라는 것을 알아야합니다. 원한다면 셸 스크립트 나 스크립팅 언어 (메이크 파일조차도)로 할 수 있습니다. curses 나 ncurses를 사용할 수 없을 때 VT100 명령에 대해 아는 진정한 가치는 무엇입니까? – slebetman

관련 문제