안녕하세요, katte입니다.
이번 글에서는 표준 출력 스트림의 버퍼를 비우는 방법에 대해 다루도록 하겠습니다.
표준 출력 스트림을 통해 바이트들을 보낼 때, ostream 클래스는 cout 객체가 다루는 출력 버퍼를 사용하기 때문에 출력이 버퍼에 쌓이게 됩니다. 그리고 이 버퍼가 가득 차면 버퍼의 데이터를 스트림의 목적지로 보내고, 새로운 데이터를 저장하기 위해 버퍼를 비우게 됩니다.
일반적으로 버퍼의 크기는 512바이트이거나, 그 배수의 크기를 가지고 있습니다.
그러나 출력을 위해 이 버퍼가 가득찰 때까지 기다리는 것은 효율적이지 못합니다.
출력할 내용이 한 줄인데, 이 한 줄의 출력을 위해 512바이트가 가득 찰 때까지 기다릴 수는 없는 셈이니까요.
따라서 프로그램은 버퍼가 가득 찰 때까지 기다리다가, 도중에 개행문자를 만나게 되면 버퍼를 자동으로 비우게 됩니다.
또한 그 외에도 긴급 입력을 받아야 할 때에도 버퍼가 비워집니다.
예를 들어,
std::cout << "하나의 수를 입력하십시오: ";
float num;
std::cin >> num;
위와 같은 상황에서는 출력할 내용에 개행문자가 없더라도 그 뒤의 입력을 예상하고 버퍼를 자동으로 비우게 됩니다.
또한 조정자와 함수를 사용해서 강제로 버퍼를 비워 출력시킬 수도 있습니다.
우리가 개행문자 대신 사용하던 endl 조정자는 버퍼를 비우고 개행문자를 삽입하는 역할을 합니다.
flush 함수 또한 버퍼를 비우는 역할을 합니다.
flush 함수는 ostream 객체의 레퍼런스를 매개변수로 받고, 리턴하기 때문에 연달아서 ostream의 멤버함수를 사용할 수 있습니다.
따라서 다음과 같이 사용할 수 있습니다.
std::flush(std::cout).put(ch);
또한 flush 함수는 조정자로도 사용할 수 있습니다.
std::cout << std::flush;
위와 같은 사용은 flush 함수 호출과 같은 기능을 수행합니다.
* 해당 글은 'C++ 기초 플러스 6판' 의 내용을 참고하여 작성되었습니다.
'Computer > C++' 카테고리의 다른 글
[C++] 배열 포인터 정리 (0) | 2022.11.11 |
---|---|
[C++] cout 관련(3) - 출력 형식 지정 (0) | 2022.11.06 |
[C++] cout 관련(1) - write, put 출력 멤버함수 (0) | 2022.11.06 |
[C++] 입출력과 스트림, 버퍼 (0) | 2022.10.26 |
[C++] cin 잘못된 입력 판별하기, 입력 버퍼 비우기 (0) | 2022.10.23 |