본문 바로가기

Programming/C&C++

cout 출력 포맷 설정하기

출처 : http://repilria.tistory.com/243


cout은 ostream의 메서드이며,
ostream 클래스는 ios 클래스로부터 상속되고, ios 클래스는 ios_base 클래스로부터 상속된다.
ios_base 클래스는 출력 상태를 서술하는 정보를 가지고 있다.

1. 진법 변경
Manipulator를 사용하여 화면에 정수를 출력할 때 사용되는 진법을 제어하며, ios_base의 멤버 함수를 사용하여 필드 폭과 소수점 아래 자릿수를 제어할 수 있다.
즉, hex(cout)과 같은 함수 호출은 cout 객체의 수치 출력을 16진수로 설정하며, 다른 진법으로 다시 설정될 때 까지 모든 정수들을 16진법으로 출력한다.
또한 cout << hex; 와 같은 형식으로도 함수를 호출할 수 있으며 namespace std에 들어 있다.

2. 필드 폭 조정
width() 멤버 함수를 사용하여, 필드 폭을 설정할 수 있다.

int width();
int width(int i);


첫 번째 원형은 현재 설정된 필드 폭을 리턴하며, 두 번째 원형은 필드 폭을 i 칸으로 설정하고, 이전의 필드 폭을 리턴한다.
width() 메서드는 바로 다음에 출력될 항목에만 영향을 미친다. 그 항목을 지나면 필드 폭은 다시 default 값으로 환원된다.

cout << '#';
cout.width(12);
cout << 12 << "#" << 24 << "#\n";

#          12#24#


3. 채움 문자
fill() 멤버 함수는 필드 폭의 남는 부분을 바꾸어 준다. 기본적으로 ' '(공백)이 default로 지정 되어 있다.
필드 폭과는 다르게, 새로운 채움 문자는 다시 변경될 때 까지 계속 유지 된다.

cout.fill('*');
cout.width(7);
cout << 900 << endl;


*****900

4. 부동 소수점수의 출력 정밀도 설정
precision()이라는 멤버 함수를 사용하여 정밀도를 다르게 설정할 수 있다. 디폴트 모드에서 정밀도는 출력되는 총 자릿수를 의미하며, 고정 소수점 표기 모드와 지수 표기 모드에서는 소수점 아래 자릿수를 의미한다. C++의 default 정밀도는 6자리이며 뒤에 붙는 0은 버린다. 설정된 정밀도는 다시 설정될 때 까지 계속 유지된다.

5. 뒤에 붙는 0과 소수점 출력
iostream 계열의 클래스들은 이것을 전담하여 수행하는 함수를 제공하지 않지만, ios_base 클래스는 몇 가지 출력 형식을 제어하는 setf() 함수를 제공한다. (setf 는 set flag의 약자)

cout.setf(ios_base::showpoint);

위와 같은 함수 호출은 cout이 뒤에 붙는 소수점을 출력하도록 만든다. 또한 디폴트 부동 소수점 형식에서 뒤에 붙는 0들도 출력하게 만든다. 즉, 디폴드 정밀도가 6일 경우에 2.00을 2로 출력하지 않고 2.00000으로 출력한다.

setf() 멤버 함수 또한 2가지 원형을 가지고 있다.

fmtflags setf(fmtflags);
fmtflags setf(fmtflags, fmtflags);

첫 번째 원형은 모든 플래그들이 이전의 설정값을 나타내는 fmtflags형의 수이다. 나중에 원래의 설정값으로 복원하기 위해 리턴값을 저장해 둘 수 있다. 다음과 같은 상수들을 전달인자로 사용할 수 있다.

 출력 형식 지정 상수 의미
 ios_base::boolalpha bool 값을 true와 false로 입력하고 출력한다.
 ios_base::showbase 출력에 진법 표시 접두어(O, Ox)를 사용한다.
 ios_base::showpoint  뒤에 붙는 소수점을 표시한다.
 ios_base::uppercase  16진 출력, E 표기에 대문자를 사용한다.
 ios_base::showpos  양수 앞에 + 부호를 사용한다.


두번째 원형은 두 개의 전달인자를 취하고, 이전의 설정값을 리턴한다. 첫 번째 전달인자는 원하는 설정이 담긴 값이고, 두 번째 전달인자는 해당 비트들을 깨끗하게 지우는 값이다.
예를들어 다음과 같이 함수를 호출할 수 있다.

cout.setf(ios_base::hex, ios_base::basefield);

두번째 원형에서 사용가능한 상수들은 다음과 같다.

 제 2 전달인자 제 1 전달인자 의미
 ios_base::basefield ios_base::dec
 ios_base::oct
 ios_base::hex
 10진법 사용
 8진법 사용
 16진법 사용
 ios_base::floatfield ios_base::fixed
 ios_base::scientific
 고정 소수점 표기 사용
 과학적 E 표기 사용
 ios_base::adjustfield ios_base::left
 ios_base::right
 ios_base::internal
 왼쪽 정렬 사용
 오른쪽 정렬 사용
 부호 또는 진법 접두어은 왼쪽 정렬,
 값은 른쪽 정렬


또한 setf로 설정한 것들은 unsetf로 해제할 수 있다. 예를 들어,

cout.setf(ios_base::showpoint); //뒤에 붙는 소수점을 출력
cout.unsetf(ios_base::showpint); //뒤에 붙는 소수점을 출력 안함


만일 설정된 비트가 없거나 두 비트가 모두 설정된 것과 같다거나 그 밖의 다른 조합이면 디폴드 모드가 사용된다.
그러므로 다음과 같은 호출은 디폴드 모드를 호출하는 방법이다.

cout.setf(0, ios_base::floatfield);

제 2 전달인자는 두 비트를 모두 끈다. 그리고 제 1 전달인자는 어떤 비트도 설정하지 않는다. 이를 unsetf()를 이용한다면 다음과 같다.

cout.unsetf(ios_base::floatfield);

6. 표준 조정자
setf()의 사용이 다소 난해하고 어려우므로, C++에서는 setf를 호출하는 몇 가지 조정자(manipulator)를 제공한다.
이 조정자들은 대부분의 구형 C++ 컴파일러에서 사용할 수 없다. 표준 조정자들은 아래와 같다.

 조정자 호출
 boolalpha setf(ios_base::boolalpha)
 noboolalpha unsetf(ios_base::boolalpha)
 showbase setf(ios_base::showbase)
 noshowbase unsetf(ios_base::showbase)
 showpoint setf(ios_base::showpoint)
 noshowpoint unsetf(ios_base::showpoint)
 showpos setf(ios_base::showpos)
 noshowpos unsetf(ios_base::showpos)
 uppercase setf(ios_base::uppercase)
 nouppercase unsetf(ios_base::uppercase)
 internal setf(ios_base::internal, ios_base::adjustfield)
 left setf(ios_base::left, ios_base::adjustfield)
 right setf(ios_base::right, ios_base::adjustfield)
 dec setf(ios_base::dec, ios_base::basefield)
 hex setf(ios_base::hex, ios_base::basefield)
 oct setf(ios_base::oct, ios_base::basefield)
 fixed setf(ios_base::fixed, ios_base::floatfield)
 scientfific setf(ios_base::scientific, ios_base::floatfield)


이들 조정다는 cout << left << fixed; 와 같은 방법으로 사용할 수 있다.

7. iomanip 헤더 파일
가장 많이 사용되는 함수가 정밀도를 결정하는 setprecision(), 채움 문자를 설정하는 setfill(), 필드 폭을 지정하는 setw() 함수이다. 이들 의 사용법은 다음과 같다.

cout << setw(6) << setfill('.') << "root" << setprecision(3);

 기능 구형 C++ 신형 C++
 precision(n) 소수점 아래 n 자리를 출력 디폴드 모드에서는 총 n자리를 출력. 고정 소수점 표기 모드와 과학적 E 표기 모드에서는 소수점 이하 n 자리를 출력

 setiosflags


 
 ios::showpoint 뒤에 붙는 소수점과 0 출력 뒤에 붙는 소수점 출력
 ios::fixed,
 ios::scientific
  뒤에 붙는 0들을 출력