[C++] 포맷

cheon2308
|2023. 12. 21. 15:01
728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

<< 연산자나 cout의 put(), write() 멤버 함수는 포맷 없이 데이터를 출력한다. C+는 C 언어의 scanf()나 printf() 처럼 포맷 입출력을 아래 3가지 방법으로 지원한다.

  1. 포맷 플래그
  2. 포맷 함수
  3. 조작자

 

포맷 플래그

  • C++ 입출력 스트림은 아래와 같이 32개의 포맷 플래그(format flag)를 저장하는 멤버 변수를 두고, 이름 참조하여 포맷 입출력
  • 포맷 플래그는 모든 입출력 스트림에서 공통으로사용되므로 ios 클래스에 정수형 상수로 정의되어 있다.
  • 하나의 플래그는 한 비트(bit)로 표현되며 한 가지 포맷 정보를 표현
  • cin이나 cout은 입출력 시 이 포맷 변수에 세팅된 플래그 값을 반영하여 포맷 입출력을 수행한다. 

 

  • 포맷을 지정하는 함수는 setf(), 지정된 플래그를 해제하는 함수는 unsetf()이다.
long setf(long flags)
// flags를 스트림의 포맷 플래그로 설정하고 이전 플래그를 리턴한다.

long unsetf(long flags)
// flags에 설정된 비트 값에 따라 스트림의 포맷 플래그를 해제하고 이전 플래그를 리턴한다.

 

  • 만일 정수 30을 16진수로 출력하고자 한다면 아래와 같이 작성하면 된다.
cout.unsetf(ios::dec); // 10진수 해제
cout.setf(ios::hex); // 16진수로 설정
cout << 30 << endl; // 1e 출력

 

  • 여러 플래그들을 비트-OR( | ) 연산으로 합치면 여러 포맷을 동시에 지정할 수 있다.
cout.setf(ios::dec | iods::showpoint); // 10진수 표현과 동시에 실수 경우 소수점 이하 나머지 빈 칸은 0으로 출력

cout << 23.5 << endl; // 23.5000 출력

 

포맷 함수 활용 - 너비 설정, 빈칸 채우기, 유효 숫자 자리수 지정

  • ostream 클래스의 멤버 함수 width(), fill(), precision()은 각각 출력되는 필드의 너비, 유효 숫자 개수, 빈칸을 채우는 문자 등을 지정하는데 사용된다.
  • 이 함수로 지정된 포맷은 << 연산자를 이용하여 출력될 때만 적용된다.
필드의 최소 너비 설정, width()
  • 숫자나 문자열은 문자의 개수만큼 화면 공간을 차지한다.
  • width() 함수는 하나의 필드가 차지하는 화면의 최소 너비를 지정한다.
  • 또한, 호출 직 후 하나의 필드에만 적용되므로 주의하여야 한다.
int width(int minWidth)
// 출력되는 필드의 최소 너비를 minWidth로 설정하고 이전에 설정된 너비 값 리턴
cout.width(10); // 다음에 출력되는 "Hello"를 10칸으로 지정
cout << "Hello" << endl;
cout.width(5); // 다음에 출력되는 정수 12를 5칸으로 지정
cout << 12 << endl;

/*
     Hello
   12
*/

 

필드의 빈 공간 채우기, fill()
  • 필드의 실제 크기가 width()에 의해 정의된 너비보다 작을 때, 남은 칸은 빈칸으로 채워진다.
  • fill()함수를 이용하면 빈칸을 채울 문자를 지정할 수 있다.
char fill(char cFill)
// 필드의 빈칸을 cFill 문자로 채우도록 지정하고 이전 문자 값 리턴

 

유효 숫자 자리수 지정, precision()
  • 출력 스트림은 숫자를 출력할 때 유효 숫자 자리수를 디폴트로 6으로 정하고 있다.
  • 개발자는 아래와 같은 precision() 멤버 함수를 호출하여 유효 숫자의 자리수를 변경할 수 있다.
int precision(int np)
// 출력되는 수의 유효 숫자 자리수를 np개로 설정. 정수 부분과 소수점 이하의 수의 자리를 모두 포함하고 소수점(.)은 제외

 

조작자

  • 조작자는 ANSI/IOS 표준 C++ 헤더 파일에 정의된 특별한 원형(function prototype)을 가진 함수
  • 매개 변수 없는 조작자와 매개 변수를 하나 가진 조작자로 나뉘며, 항상 << , >> 연산자와 함께 사용된다.
매개 변수 없는 조작자
  • 조작자를 사용하기 위해서는 <iostream> 헤더 파일을 include 해야 한다.
  • 아래는 매개 변수 없는 조작자들이다.

 

매개 변수를 가지는 조작자
  • <iomanip> 헤더 파일include 해야 한다.

 

조작자의 특징
  • 조작자는 사용하기 쉽고 출력 코드를 간결하게 만들기 때문에, setf(), width(), fill(), precision() 등의 멤버 함수보다 조작자의 사용을 권한다. 
  • 그러나 조작자로 설정한 포맷은 한 번의 입출력에만 적용되므로 입출력마다 포맷을 지정해야 한다.
  • 대부분의 조작자는 내부에서 setf() 함수를 호출한다.
728x90

'Programming Language > C++' 카테고리의 다른 글

[C++] 사용자 조작자 만들기  (1) 2023.12.21
[C++] 삽입 연산자(<<)와 추출 연산자(>>)  (0) 2023.12.21
[C++] ostream과 istream  (1) 2023.12.20
[C++] 입출력 기초  (1) 2023.12.20
[C++] struct with Cpp  (3) 2023.12.20