728x90
황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!
https://search.shopping.naver.com/book/catalog/32436115747
<< 연산자나 cout의 put(), write() 멤버 함수는 포맷 없이 데이터를 출력한다. C+는 C 언어의 scanf()나 printf() 처럼 포맷 입출력을 아래 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 |