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()

    • failbitbadbit가 설정되어있으면 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