2016-09-28 2 views
3

\b의 사용을 이해하기 위해 작은 C++ 프로그램을 작성했습니다. 이 프로그램은 아래에 주어진다 - 그래서C++에서 endl 및 n과 함께 백 스페이스 사용

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

,이 프로그램은 백 스페이스는 하나 개의 공간이 다시 커서를 이동하고 !가 인쇄되지 않는 이유 buffer.So에서 삭제되지 때문에 원하는 출력 Hello World .This이 발생하지 않아야 제공 ?

자, 그래서 다른 프로그램 -

#include <iostream> 
using namespace std; 
int main(){ 
    cout << "Hello World!" << "\b"; 
    cout << "\nAnother Line\n"; 
    return 0; 
} 

을 고려, 여기 출력은 - Hello World! Another Line 왜 백 스페이스가 여기에 작동하지 않습니다 무엇입니까? 개행은 버퍼를 플러시하지 않아야하므로 !을 삭제해야합니다. 여기에 문제가 있습니까? endl는 buffer.So, 플러시 반면 나는 경우 모두에서 \b 이후에 endl 또는 \n 추가 또한

, 출력 Hello World! 나누었다은, 개행 문자 출력이 모두 동일한 방법에 버퍼를 플러쉬하지 않습니다 그 사건들?

+2

2 가지 가정이 잘못되었습니다. .1 .1. _ "백 스페이스는 커서를 한 칸 뒤로 이동하기 때문에 발생하지 않아야합니다 ..."_. 2. _ "하지만 개행 문자가 버퍼를 플러시하지 않습니다 ..."_ 후자는 구현에 따라 다릅니다. –

+0

프로그램이 종료되면 "!"를 덮어 쓰는 프롬프트가 출력됩니다. 또한 프로그램이 종료 될 때'cout'은 flush된다. '\ b'의 작동 방식은'C++ '과 아무 관련이 없습니다. 'C++'은 당신이 콘솔에 알려주는 모든 문자를 (또는 다른 어떤 일이 일어날지라도) 보냅니다. 콘솔 작동 방식은 콘솔에 따라 다릅니다. – Galik

+0

그래서 @ πάνταῥεῖ,'\ n'을 사용하여 버퍼를 플러시 할 수 있습니까? –

답변

-1

첫 번째 프로그램의 출력이 다음과 같은 것으로 가정합니다.

$ ./hello 
Hello World$ 

그렇다면 !은 버퍼에서 삭제되지 않습니다. 쉘이 프롬프트를 인쇄 할 때 clobbered입니다.

두 번째 프로그램의 경우 버퍼가 플러시 될 때 \b이 처리되는 방식이 아닌 터미널에 전송 될 때만 영향을줍니다. \b은 스트림의 일부이며 터미널은이를 "하나의 열 백업"을 의미하는 것으로 해석합니다. 이 명확하지 않으면, STDOUT 에 전송 된 실제 바이트에서 살펴 :

$ ./hello2 | hexdump -C 
00000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 08 0a 41 6e |Hello World!..An| 
00000010 6f 74 68 65 72 20 4c 69 6e 65 0a     |other Line.| 
0000001b 

\b\n (080a 각각) 뒤에, 당신은 당신의 프로그램에 cout에 쓴 일치.

마지막으로 cout은 프로그램이 종료 될 때 플러시되므로이 예제에서 \n 또는 endl을 전달하는지 여부는 중요하지 않습니다. 실제로 \nstdout이 터미널에 연결되어 있기 때문에 어쨌든 플러시 될 것입니다.