컴공생의 다이어리

[c++] 형식 플래그(format flag)와 조작자(Manipulator) 본문

Development/C & C++

[c++] 형식 플래그(format flag)와 조작자(Manipulator)

컴공 K 2021. 1. 3. 02:11

ios_base 클래스에서, 스트림의 입출력 형식을 바꿀 수 있다. 예를 들어서 일반적으로 수를 입력하면 10진수로 처리되었지만, 이번에는 16진수로 처리할 수 있는 방법은 아래와 같다.

#include <iostream>
#include <string>
int main() {
	int t;
	while (true) {
		std::cin.setf(std::ios_base::hex, std::ios_base::basefield);
		std::cin >> t;
		std::cout << "입력 :: " << t << std::endl;
		if (std::cin.fail()) {
			std::cout << "제대로 입력해주세요" << std::endl;
			std::cin.clear();	// 플래그들을 초기화 하고
			std::cin.ignore(100,'n');//개행문자가 나올 때까지 무시한다
		}
		if (t == 0) break;
	}
}
더보기

ff
입력 :: 255
0xFF
입력 :: 255
123
입력 :: 291
ABCDE
입력 :: 703710

위와 같이 16진수 입력을 잘 받는 것을 볼 수 있다. 이처럼 입력받는 형식을 16진수로 바꿔준 함수는 스트림의 설정의 바꾸는 setf 함수이다.

std::cin.setf(std::ios_base::hex, std::ios_base::basefield);

setf 함수의 버전은 2개가 있다. 하나는 인자를 1개만 받는 것이고, 다른 하나는 위에서 사용한 것처럼 인자를 2개 취하는 것이다. 인자 1개를 받는 setf는 그냥 인자로 준 형식 플래그를 적용하는 것이지만, 인자 2개를 받는 것은, 두번째 인자 (위에서 basefield)의 내용을 초기화 하고, 첫 번째 인자(hex)를 적용하는 것이다.

위 경우, 수를 처리하는 방식은 1가지 진수만 한 번에 처리할 수 있으므로, 몇 진법으로 수를 처리할지 보관하는 basefiled의 값을 초기화하고, 16진법(hex) 플래그를 적용시킨 것이다.

 

 

아래와 같은 방식으로도 16진수를 받을 수 있다.

#include <iostream>
#include <string>

int main() {
	int t;
	while (true) {
		std::cin >> std::hex >> t;
		std::cout << "입력 :: " << t << std::endl;
		if (std::cin.fail()) {
			std::cout << "제대로 입력해주세요" << std::endl;
			std::cin.clear(); // 플래그들을 초기화 하고
			std::cin.ignore(100, 'n'); //개행문자가 나올 때까지 무시한다
		}
		if (t == 0) break;
	}
}
더보기

ff
입력 :: 255 
0xFF 
입력 :: 255 
123 
입력 :: 291 
ABCDE 
입력 :: 703710

위 경우도 역시 16진수를 잘 입력 받는다. hex가 cin에서 수를 받는 방식을 바꿔버렸기 때문이다. 이 때문에 hex와 같이 스트림을 조작하여 입력 혹은 출력 방식을 바꿔주는 함수를 조작자라고 부른다.

std::cin>>std::hex>>t;

여기서의 hex는 ios에 정의되어 있는 함수이고 맨 위의 setf에서의 hex는 ios_base에 선언되어 있는 단순한 상수 값이다.

 

 

modoocode.com/312

 

씹어먹는 C++ 강좌 - PDF 파일

 

modoocode.com

 

728x90

'Development > C & C++' 카테고리의 다른 글

[c++] 파일 전체 읽기  (0) 2021.01.03
[c++] 파일 입출력  (0) 2021.01.03
[c++] cin (입력 받기)  (0) 2021.01.02
[c++] string 관련 함수  (0) 2020.12.27
[c++] const 함수  (0) 2020.12.27
Comments