포맷 플래그
포맷 플래그는 C++에서 입출력 형식을 지정하기 위한 플래그이다. C에서는 printf()
와 함께 다양한 형식 지정자 및 플래그를 사용하여 입출력 형식을 지정하였지만 C++에서는 입출력 스트림을 이용하여 입출력을 제어하고, 이때 std::cin
혹은 std::out
이 사용되기 때문에 C와 다른 방식으로 입출력 형식을 지정해주어야 한다.
플래그 | 값 | 의미 |
ios::skipws |
$\rm 0x0001$ | 입력 스트림에서 공백 문자(Space , Tap , Enter ) 무시 |
ios::unitbuf |
$\rm 0x0002$ | 출력 스트림에 들어오는 데이터를 버퍼링하지 않고 바로 출력 |
ios::uppercase |
$\rm 0x0004$ | 16진수 표현의 알파벳을 대문자로 출력 |
ios::showbase |
$\rm 0x0008$ | 16진수는 $\rm 0x$를, 8진수는 $0$을 붙여 출력 |
ios::showpoint |
$\rm 0x0010$ | 소수점 이하 끝자리들의 남는 공간을 $0$으로 출력 |
ios::showpos |
$\rm 0x0020$ | 양수이면 + 기호 출력 |
ios::left |
$\rm 0x0040$ | 왼쪽 정렬하여 출력 |
ios::right |
$\rm 0x0080$ | 오른쪽 정렬하여 출력 |
ios::internal |
$\rm 0x0100$ | 부호는 왼쪽 정렬로, 숫자는 오른쪽 정렬로 출력 |
ios::dec |
$\rm 0x0200$ | 정수 필드를 10진수로 출력 |
ios::oct |
$\rm 0x0400$ | 정수 필드를 8진수로 출력 |
ios::hex |
$\rm 0x0800$ | 정수 필드를 16진수로 출력 |
ios::scientific |
$\rm 0x1000$ | 실수 필드를 지수 표기법으로 출력 |
ios::fixed |
$\rm 0x2000$ | 실수 필드를 고정소수점 표기법으로 출력 |
ios::boolalpha |
$\rm 0x4000$ | 설정시 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진수는 $\rm 0x$를, 8진수는 $0$을 붙여 출력 |
noshowbase |
O | showbase 지정 취소 |
showpoint |
O | 소수점 이하 끝자리들의 남는 공간을 $0$으로 출력 |
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;
'Language > C & C++' 카테고리의 다른 글
[ C++] 예외 처리(exception handling) (0) | 2024.12.06 |
---|---|
[C++] 파일 입출력 스트림(file I/O stream) 및 파일 포인터(file pointer) (0) | 2024.12.06 |
[C++] 입출력 스트림(I/O stream) 및 버퍼(buffer) (0) | 2024.12.04 |
[C++] 람다(lambda) 표현식 (0) | 2024.11.15 |
[C++] auto 키워드 (0) | 2024.11.14 |