💻 개인공부 💻/C | C++

[C++] 포맷 플래그

공대생 배기웅 2020. 6. 12. 21:48
반응형

출처 => C++ How to Program (Detitel / Prenticehall)

 

 

포맷 플래그란? 포맷 플래그의 종류는?

 

▶ 포맷플래그는 C언어에서의 printf().와 유사한 역할을 한다.

포맷 입출력 방법에는 3가지가 있는데 포맷 플래그, 포맷 함수, 그리고 조작자 이다. 이 세 가지에 대하여 오늘은 알아보려고 한다.

 

1-1. 포맷 플래그

 

▶ 입력스트림에서 입출력 형식을 지정하기 위한 플래그이다. 

ios클래스에서 정의된 포맷 플래그는 아래의 표와 같다.

 

 

그리고 아래에 있는 표는 포맷 플래그를 세팅하는 멤버함수들이다. 

 

 

setf()메소드는 플래그를 실행하는 역할, unsetf()메소드는 플래그 실행을 해제하는 역할을 한다고 보면 된다.

 

cout.unsetf(ios::dec)
cout.setf(ios::hex)
cout<<30<<endl;

 

이 코드를 보면, dec 플래그를 해제하고 hex 플래그를 실행하였다. 위의 표를 살짝 컨닝을 하니, 10진수로 표기하는 것을 해제하고, 16진수로 출력하라는 것을 의미함을 알 수 있다. 

출력을 해본 결과, 30의 16진수인 1e가 나옴을 알 수 있다. 

(1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18 19 1a.......)

 

1-2. 포맷 플래그 - 예시 소스코드

 

30이라는 숫자를 출력하기 위해서는 다음과 같다. (very SIMPLE!!)

 

cout<<30<<endl;

 

30을 16진수로 나타내려면 다음과 같다. 

 

cout.unsetf(ios::dec); // 10진수 해제
cout.setf(ios::hex); //16진수로 설정
cout<<30<<endl; //1e출력

 

16진수 앞에 0x를 붙인다.

 

cout.setf(ios::showbase); //16진수로 설정
cout<<30<<endl;

 

0x를 0X처럼 문자로 설정하고 싶다면 아래와 같다.

 

cout.setf(ios::uppercas4e); //16진수의 a~f를 대문자로 변환하여 출력
cout<<30<<endl;

 

10진수로 표현하면서 소숫점 이하의 나머지를 0으로 출력한다 하면 아래와 같다.

 

cout.setf(ios::dec|ios::showpoint)
cout<<23.5<<endl; //23.5000으로 출력

 

2-1. 포맷 함수

 

 

출력이 되는 칸을 10칸으로 지정할 때

cout.width(10); //출력이 되는 칸을 10칸으로 한정
cout<<"Hello"<<endl;
//     Hello

 

Hello외의 빈칸을 ^로 채우고 싶을 때

cout.fill('^');
cout.width(10);
cout<<"Hello"<<endl;
//^^^^^Hello

 

2-2. 포멧 함수 - 예시 소스코드

 

#include<iostream>
using namespace std;

int n;
char s;
string word;
void showWidth() {
	cout.fill(s);
	cout.width(n);
	cout << word << endl;
}

int main() {
	cin >> n;
	cin >> s;
	cin >> word;
	showWidth();
}

 

 

3-1. 조작자

 

▶manipulator, 혹은 스트림 조작자라고도 부른다.

조작자는 함수이다. c++에서 기본적으로 주어지는 라이브러리의 조작자는 입출력 포맷 지정이 목적이다. 다른 목적이 있어 기본적인 조작자외의 다른 조작자가 필요하면 이는 개발자가 따로 제작이 가능하여 사용할 수 있다.

 

 

매개 변수가 없는 조작자

cout<<hex<<showbase<<30<<endl; //0x1e
cout<<dec<<showpos<<100<<endl; //+100

 

매개 변수가 있는 조작자

#include<iomanip>
cout<<setw(10)<<setfill('^')<<"Hello"<<endl; //^^^^^Hello

 

▶ 매개변수가 필요 없는 조작자

 

▶매개변수를 가진 조작자

 

3-2. 조작자 예시 소스코드(매개 변수를 가진 조작자 사용 예)

 

#include<iostream>
#include<iomanip>
using namespace std;

int main() {
	cout << showbase;

	cout << setw(8) << "Number";
	cout << setw(10) << "Octal";
	cout << setw(10) << "Hexa" << endl;

	for (int i = 0; i < 50; i += 5) {
		cout << setw(8) << setfill('*') << dec << i;
		cout << setw(10) << setfill('^') << dec << i;
		cout << setw(10) << setfill('.') << dec << i << endl;;

	}
}

 

728x90
반응형