2011-08-05 2 views
3

화면을 지우지 않고 터미널에 인쇄 한 텍스트를 수정할 수 있습니까?터미널에서 텍스트 수정

예를 들어, 어떤 항목의 진행률을 백분율로 표시하는 경우 화면을 지우고 다시 인쇄하지 않고도 그 비율을 수정할 수 있습니까? 하나 있다면 크로스 플랫폼 방법을 찾고 있어요.

Talking C++.

감사

+0

줄 바꿈없이 캐리지 리턴을 사용하고 회선을 덮어 씁니다. – knittl

+0

@knittl : 터미널 에뮬레이션에 따라 다릅니다. 일부 에뮬레이션은 캐리지 리턴이 전송 될 때 줄 바꿈을 수행합니다. –

답변

5

이렇게하는 방법에는 여러 가지가 있으며, 얼마나 많은 노력을 기울 이느냐에 따라 터미널 창에서 ascii 텍스트로 많은 멋진 작업을 수행 할 수 있습니다.

  1. 고급 : ncurses library

  2. 쉽게 : ansi escape characters with printf or cout

  3. 가장 쉬운 : 다른 사람이 말했듯이, 단순히 라인 피드가없는 캐리지 리턴을 위해 \r를 사용합니다.

편집 : 다시 두 개의 문자를 이동하려면 ESC 시퀀스를 사용의 예 :

리눅스 시스템에서
#include <iostream> 
#define ESC char(0x1B) 

int main(){ 
    std::cout << "This will overwrite 'rs' in the following: characters" << ESC << "[2D" << "xx" << std::endl; 
    return 0; 
} 
+0

ANSI 이스케이프 문자가 필요한 것처럼 작동하는 것 같습니다. 2 문자 남았는데 어떻게 갈 건데? std :: cout << \ 2d와 같은 것; ? – Lockhead

+0

@MisterSir - 대문자'D' 사용 :'std :: cout << "다음과 같이 'rs'를 덮어 씁니다 :"<< char (0x1B) << "[2D"<< "xx"<< std :: endl;' –

+0

작품, 고마워! – Lockhead

3

그것이 '\ r에'문자 다음에 문자열을 출력하는 것입니다 할 수있는 아주 간단한 방법. 그것은 캐리지 리턴 자체이며, 대부분의 콘솔에서는 커서를 줄의 시작 부분으로 내려 가지 않고 커서를 반환합니다. 이렇게하면 현재 줄을 덮어 쓸 수 있습니다.

stdout 또는 cout에 쓰거나 clog가 fflush 또는 std :: stream을 즉시 저장하도록 스트림을 플러시하도록하십시오. stderr 또는 cerr에 쓰려면 스트림이 버퍼링되지 않고 모든 출력이 즉각적이고 비효율적입니다.

더 복잡한 방법은 curses와 같은 스크린 드로잉 라이브러리를 사용하는 것입니다.

1

ncurses 패키지를 확인하십시오. 이 패키지는 대부분의 터미널에서 커서 이동을 지원합니다. 에서 최종 라인 (ENDL 또는 '\ n')를 넣어하지 않도록 명심

for(int i = 0; i < 60; i++){ cout << "\rValue of i: " << i;}

:

1

당신은 그 라인의 첫 번째 문자로 돌아가려면 "\ R"문자를 사용할 수 있습니다 출력이 끝나거나 매번 새로운 라인의 처음으로 건너 뛰고, 원하는 효과를 잃어 버리게됩니다.