C++/Library 2021. 3. 11. 16:34

cin

현재 내가 사용하는 윈도우 컴퓨터 기준으로 작성했다.

상속 관계

  • cinistream 라이브러리 내부 basic_istream 클래스의 객체이다.

  • basic_istream 클래스는 ios 라이브러리 내부 basic_ios 클래스를 상속받는다.

  • basic_ios 클래스는 xiosbase 라이브러리 내부 ios_base 클래스를 상속받는다.

  • ios_base 클래스는 _Iosb 클래스를 상속받는다.

    #define _CRTIMP2_IMPORT __declspec(dllimport)
    #define _CRTDATA2_IMPORT _CRTIMP2_IMPORT
    
    class _CRTIMP2_PURE_IMPORT ios_base : public _Iosb<int>;
    class basic_ios : public ios_base;
    class basic_istream : virtual public basic_ios<_Elem, _Traits>;
    using istream       = basic_istream<char, char_traits<char>>;
    __PURE_APPDOMAIN_GLOBAL extern _CRTDATA2_IMPORT istream cin;

_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

  • operator! 연산자 오버로딩, clear(), rdstate(), setstate(), good(), eof(), fail(), bad() 등의 함수가 내장되어있다.

  • 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

  • basic_istream, basic_ostream 클래스의 base class

  • clear(), setstate() 함수의 기본 값 설정


basic_istream

  • 각 자료형에 대해 operator>> 연산자 오버로딩으로 변수에 값을 넣도록 하였다.

    • 처음에 _Err = ios_base::goodbit 로 설정한 뒤 결과에 따라 _Myios::setstate(_Err) 로 오류 상태 플래그를 설정
  • use_facet 관련은 locale을 알아야 할 것 같다. 참고

    template <class _Ty>
      basic_istream& _Common_extract_with_num_get(_Ty& _Val) { // formatted extract with num_get
      ios_base::iostate _Err = ios_base::goodbit;
      const sentry _Ok(*this);
    
      if (_Ok) { // state okay, use facet to extract
        _TRY_IO_BEGIN
          _STD use_facet<_Nget>(this->getloc()).get(*this, {}, *this, _Err, _Val);
        _CATCH_IO_END
      }
    
      _Myios::setstate(_Err);
      return *this;
    }
    
    basic_istream& __CLR_OR_THIS_CALL operator>>(unsigned int& _Val){ // extract an unsigned int
        return _Common_extract_with_num_get(_Val);
    }
    ...

입력 버퍼 무시하기

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

C++ typeinfo  (0) 2021.03.11
C++ cin.ignore  (0) 2021.03.11
C++ 난수 생성 (Random Number Generation)  (0) 2021.03.11
C++ 입력 버퍼 무시하기  (0) 2021.03.10
C++ typeinfo  (0) 2021.03.10