컴공생의 다이어리
[c++] 형식 플래그(format flag)와 조작자(Manipulator) 본문
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에 선언되어 있는 단순한 상수 값이다.
'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 |