C++/Library
2021. 3. 29. 23:57
흐름 상태 (Stream States)
흐름 상태 출력 예제
오류 상태 플래그를 통해 입력이 잘 들어갔는지에 대한 결과를 확인할 수 있다.
#include <iostream> #include <cctype> #include <string> #include <bitset> void printCharacterClassification(const int& i) { using namespace std; cout << boolalpha; cout << "isalnum : " << bool(std::isalnum(i)) << endl; cout << "isblank : " << bool(std::isblank(i)) << endl; cout << "isdigit : " << bool(std::isdigit(i)) << endl; cout << "islower : " << bool(std::islower(i)) << endl; cout << "isupper : " << bool(std::isupper(i)) << endl; } void printStates(const std::ios& stream) { using namespace std; cout << boolalpha; cout << "good() : " << stream.good() << endl; cout << "eof() : " << stream.eof() << endl; cout << "fail() : " << stream.fail() << endl; cout << "bad() : " << stream.bad() << endl; } int main() { using namespace std; while (true) { char i; cin >> i; printStates(cin); printCharacterClassification(i); cin.clear(); cin.ignore(1024, '\n'); cout << endl; } } /* stdin a A 1024 */ /* stdout stderr good() : true eof() : false fail() : false bad() : false isalnum : true isblank : false isdigit : false islower : true isupper : false good() : true eof() : false fail() : false bad() : false isalnum : true isblank : false isdigit : false islower : false isupper : true good() : true eof() : false fail() : false bad() : false isalnum : true isblank : false isdigit : true islower : false isupper : false */
위의 경우
cin
의 특성때문에isblank()
함수는 없는 것과 같다.공백도 확인하려면 다음과 같은 방식이 필요하다.
#include <iostream> #include <cctype> #include <string> #include <bitset> bool isAllDigit(const std::string& str) { for (auto& e : str) if (!std::isdigit(e)) return (false); return true; } void classifyCharacters(const std::string& str) { using namespace std; for (auto& e : str) { cout << e << endl; cout << "\tisdigit : " << isdigit(e) << endl; cout << "\tisblank : " << isblank(e) << endl; cout << "\tisalpha : " << isalpha(e) << endl; } } int main() { using namespace std; cout << boolalpha; classifyCharacters("1234"); cout << isAllDigit("1234") << endl; classifyCharacters("a 1234"); cout << isAllDigit("a 1234") << endl; } /* stdout stderr 1 isdigit : 4 isblank : 0 isalpha : 0 2 isdigit : 4 isblank : 0 isalpha : 0 3 isdigit : 4 isblank : 0 isalpha : 0 4 isdigit : 4 isblank : 0 isalpha : 0 true a isdigit : 0 isblank : 0 isalpha : 2 isdigit : 0 isblank : 64 isalpha : 0 1 isdigit : 4 isblank : 0 isalpha : 0 2 isdigit : 4 isblank : 0 isalpha : 0 3 isdigit : 4 isblank : 0 isalpha : 0 4 isdigit : 4 isblank : 0 isalpha : 0 false */
_Iosb
<xiosbase>
static constexpr _Iostate goodbit = static_cast<_Iostate>(0x0);
static constexpr _Iostate eofbit = static_cast<_Iostate>(0x1);
static constexpr _Iostate failbit = static_cast<_Iostate>(0x2);
static constexpr _Iostate badbit = static_cast<_Iostate>(0x4);
flag | meaning |
---|---|
goodbit | 오류가 없다 |
eofbit | 스트림으로부터 추출 작업(extracting operation) 진행 중 EOF에 도달 |
failbit | 마지막 입력 작업이 자체 내부 오류 때문에 실패 |
badbit | 스트림 버퍼의 입출력 작업이 실패 |
ios_base
ios::fail()
failbit
나badbit
가 설정되어있으면true
반환operator!
는fail()
을 호출한다.
ios::clear()
오류 상태 플래그를 새로운 값으로 설정
- 기본 값은
goodbit
: 오류 상태 플래그를 0으로 초기화 시킨다.
- 기본 값은
ios::rdstate()
오류 상태 플래그(error state flag)를 반환한다.
위의 비트들과
AND
연산으로 플래그를 확인할 수 있다.AND
연산은 귀찮으므로 그냥ios::eof()
,ios::fail()
,ios::bad()
,ios::good()
함수를 사용하자.
basic_ios
clear()
,setstate()
함수의 기본 값 설정
'C++ > Library' 카테고리의 다른 글
C++ fstream (0) | 2021.03.29 |
---|---|
C++ 정규 표현식 (Regular Expressions) (0) | 2021.03.29 |
C++ cout (0) | 2021.03.29 |
C++ ostream (0) | 2021.03.29 |
C++ istream (0) | 2021.03.29 |