포맷 플래그

 

포맷 플래그는 C++에서 입출력 형식을 지정하기 위한 플래그이다. C에서는 printf() 와 함께 다양한 형식 지정자 및 플래그를 사용하여 입출력 형식을 지정하였지만 C++에서는 입출력 스트림을 이용하여 입출력을 제어하고, 이때 std::cin 혹은 std::out 이 사용되기 때문에 C와 다른 방식으로 입출력 형식을 지정해주어야 한다.

플래그 의미
ios::skipws 0x00010x0001 입력 스트림에서 공백 문자(Space, Tap, Enter) 무시
ios::unitbuf 0x00020x0002 출력 스트림에 들어오는 데이터를 버퍼링하지 않고 바로 출력
ios::uppercase 0x00040x0004 16진수 표현의 알파벳을 대문자로 출력
ios::showbase 0x00080x0008 16진수는 0x0x를, 8진수는 00을 붙여 출력
ios::showpoint 0x00100x0010 소수점 이하 끝자리들의 남는 공간을 00으로 출력
ios::showpos 0x00200x0020 양수이면 + 기호 출력
ios::left 0x00400x0040 왼쪽 정렬하여 출력
ios::right 0x00800x0080 오른쪽 정렬하여 출력
ios::internal 0x01000x0100 부호는 왼쪽 정렬로, 숫자는 오른쪽 정렬로 출력
ios::dec 0x02000x0200 정수 필드를 10진수로 출력
ios::oct 0x04000x0400 정수 필드를 8진수로 출력
ios::hex 0x08000x0800 정수 필드를 16진수로 출력
ios::scientific 0x10000x1000 실수 필드를 지수 표기법으로 출력
ios::fixed 0x20000x2000 실수 필드를 고정소수점 표기법으로 출력
ios::boolalpha 0x40000x4000 설정시 true를 ture로, false를 false로 출력
설정이 안 되어 있다면 true는 1로, false는 0으로 출력

이러한 플래그는 아래 멤버 함수로 사용한다.

// flags를 스트림의 포맷 플래그로 설정 후 이전 플래그를 반환
long setf(long flags)
// flags에 설정된 비트 값에 따라 스트림의 포맷 플래그를 해제하고 이전 플래그를 반환
long unsetf(long flags)

추가적으로 아래 멤버 함수도 활용된다.

// 출력되는 필드의 최소 너비를 n으로 설정하고 이전 설정된 너비 값을 반환
int width(int n)
// 필드의 빈칸을 cFill 문자로 채우도록 설정하고 이전 문자 값을 반환
char fill(char cFill)
// 출력되는 수의 유효 숫자 자리수를 np개로 설정하는데 이때 정수, 소수점 이하 모두 포함이며 소수점 자체는 제외
int percision(int np)

 


조작자

 

구체적으로 스트림 조작자를 의미한다. 조작자는 함수이며 매개 변수가 없는 조작자와 매개 변수가 있는 조작자로 나뉜다. 만일 매개변수가 있는 조작자를 사용한다면 프로그램에 <iomanip>을 포함해야 한다.

#include <iomanip>

기본적으로 조작자는 항상 << 혹은 >> 연산자와 함께 사용된다.

매개 변수 없는 조작자
조작자 I/O 용도
endl O 스트림 버퍼를 모두 출력 후 줄바꿈
oct O 정수 필드를 8진수로 출력
dec O 정수 필드를 10진수로 출력
hex O 정수 필드를 16진수로 출력
left O 왼쪽 정렬하여 출력
right O 오른쪽 정렬하여 출력
fixed O 실수 필드를 고정소수점 표기법으로 출력
scientific O 실수 필드를 지수 표기법으로 출력
flush O 스트림 버퍼 강제 출력
showbase O 16진수는 0x0x를, 8진수는 00을 붙여 출력
noshowbase O showbase 지정 취소
showpoint O 소수점 이하 끝자리들의 남는 공간을 00으로 출력
noshowpoint O showpoint 지정 취소
showpos O 양수이면 + 기호 출력
skipws I 입력 스트림에서 공백 문자(Space, Tap, Enter) 무시
noskipws I skipws 지정 취소
boolalpha O 설정시 true를 ture로, false를 false로 출력
설정이 안 되어 있다면 true는 1로, false는 0으로 출력
매개 변수 있는 조작자
조작자 I/O 용도
resetioflags(long flags) IO flags에 지정된 플래그 해제
setbase(int base) O base를 출력할 수의 진수로 설정
setfill(char cFill) I 필드의 빈칸을 cFill 문자로 채우도록 설정
setioflags(long flags) IO flags를 스트림 입출력 플래그로 설정
setprecision(int np) O 출력되는 수의 유효 숫자 자리수를 np개로 설정하는데 이때 정수, 소수점 이하 모두 포함이며 소수점 자체는 제외
setw(int n) O 출력되는 필드의 최소 너비를 n으로 설정

 


삽입 연산자

 

삽입 연산자(insertion operator)는 << 으로 삽입자라고도 한다. 삽입 연산자는 원래 정수 시프트 연산자인데, ostream 클래스에 아래 예시와 같이 중복 작성되어 있다.

ostream& operator <<(int n);

삽입 연산자는 왼쪽에서 오른쪽으로 연쇄적으로 실행된다. 예를 들어 아래와 같은 코드가 있다고 해보자.

std::cout << 777 << "is lucky number";

그렇다면 먼저 cout.<<(777)이 호출되고 그 것의 반환값을 coutt이라 하면 coutt.<<("is lucky number")가 호출된다.

사용자가 따로 삽입 연산자를 정의할 수 있다. 예를 들어 x와 y를 출력하는 삽입 연산자를 구현하려 한다면 아래와 같이 구현해줄 수 있다.

ostream& operator <<(ostream& stream, int x, int y) {
    stream << "x = " << x << " y = " << y;
    return stream;
}

 


추출 연산자

 

추출 연산자(extraction operator)는 >> 으로 추출자라고도 한다. 추출 연산자는 원래 정수 시프트 연산자인데 ostrea 클래스에 아래 예시와 같이 중복 작성되어 있다.

ostream& operator >>(int n);

추출 연산자 역시 삽입 연산자와 유사하게 연쇄적으로 실행된다.

삽입 연산자와 마찬가지로 사용자가 따로 정의할 수 있다. 예를 들어 두 정수를 입력받고 그 합을 반환하고 싶다면 아래와 같이 구현해줄 수 있다.

istream& operator >>(istream& stream, int& n) {
    std::cout << "두 정수 입력: ";
    int x, y;
    std::cin >> x >> y;
    n = x + y;
    return stream;
}

 


매개 변수 없는 조작자 사용자 정의

 

입력 스트림에 사용되는 조작자 원형은 다음과 같다.

istream& manipulatorFunction(istream& ins)

출력 스트림에 사용되는 조작자 원형은 다음과 같다.

ostream& manipulatorFunction(ostream& outs)

이를 활용하여 함수 이름과 내용을 바꿔서 사용자가 매개 변수 없는 조작자를 정의할 수 있다. 예를 들어 "꼬르륵"을 출력하는 매개 변수 없는 조작자를 정의한다고 해보자.

ostream& hungry(ostream& outs) {
    return outs << "꼬르륵";
}

이제 아래와 같이 사용하면 꼬르륵이 출력될 것이다.

std::cout << hungry << std::endl;

 

애스터로이드