1. 상태 플래그
istream, ostream은 각각 입출력에 사용되는 스트림으로, cin, cout과 같은 형태로 사용할 수 있다. 해당 스트림들은 4개의 상태 플래그를 갖고 있는데, 각각 다음과 같다.
goodbit: 스트림에 입출력 작업이 가능한 상황
badbit: 스트림에 복구 불가능한 오류 발생 시
failbit: 스트림에 복구 가능한 오류 발생 시
eofbit: 입력 작업 시에 EOF에 도달 시
만약 스트림의 상태 플래그가 goodbit가 아닌 경우 입출력 작업이 불가능한 상태라고 볼 수 있다.
예를 들어, cin을 활용해 타입이 맞지 않는 값을 입력하려고 시도하면 failbit가 켜져서 입출력 작업을 수행할 수 없게 된다.
int a;
cin >> a; // 만약 문자열, 문자를 입력한다면 failbit가 set된다.
if(cin.fail()) // cin.fail()은 failbit, badbit가 set되어있으면 true return.
cout << error << endl;
else
cout << a << endl;
2. failbit 발생시 초기화
int a;
while(true) {
cin >> a;
cout << "입력값: " << a << endl;
if(cin.fail()) {
cout << "정수형태로만 입력해주세요." << endl;
cin.clear(); // 상태 플래그 초기화(failbit 초기화)
cin.ignore(100, '\n'); // 입력 버퍼의 내용을 최대 100까지 \n을
// 만날 때까지 읽어들인다. (C언어에서 입력버퍼 비우는것과 유사함)
}
if(a == 12345)
break;
}
failbit가 발생했을 경우 다시 cin으로 정보를 입력받기 위해서는 cin.clear를 활용해 상태 플래그를 다시 초기화하고 cin.ignore를 활용해 입력 버퍼를 비워 주어야 한다.
3. 형식 플래그, 조작자
setf를 활용해서 입력, 출력 형식을 바꿀 수 있다. 예를 들어서, 다음과 같이 지정한다.
std::cin.setf(ios_base::hex, ios_base::basefield);
이러면 기본적으로 cin을 통해서 입력받는 정수는 hex형태로 변경된다. 0xaa, AA, ab와 같이 입력할 수 있다. 다시 10진수로 입력받으려면 setf를 활용해서 10진수 형태로 바꾸어 주어야 한다. 위에서 ios_base는 형식 플래그에 해당한다.
hex를 입력받는 또 다른 방식이 하나 더 있다. 조작자를 활용하는 방식인데, 다음과 같다.
int a;
std::cin >> std::hex >> a; // 변수 a에 hex로 입력받기
위와 같은 방식으로 cin을 사용하면 변수 a에 입력받는 값은 hex값이 된다.
4. cin으로 문자열을 입력받는 경우
cin으로 문자열을 입력받는 경우 공백, 개행, EOF, 탭 등을 만나기 전까지만 문자열을 읽어들이게 된다. 어떠한 문장 This is sentence를 입력받는 경우를 가정하면 다음과 같이 되는 셈이다.
string s;
cin >> s; // This is sentence 입력!
cout << s << endl; // This 출력
cin >> s;
cout << s << endl; // is 출력
cin >> s;
cout << s << endl; // sentence 출력
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 프로그래밍 방법론 / 함수 객체 Functor (0) | 2023.02.13 |
---|---|
C++ 문법 / 템플릿 (0) | 2023.02.13 |
C++ 표준 라이브러리 / 파일입출력 (0) | 2023.02.13 |
C++ 문법 / 정적 메서드와 정적 멤버 변수(static) (0) | 2023.02.12 |
C++ / Deep Copy와 Shallow Copy (0) | 2023.02.12 |
댓글