모두의 코드
C++ 레퍼런스 - istream::sentry 클래스

작성일 : 2019-04-19 이 글은 107 번 읽혔습니다.

아직 C++ 에 친숙하지 않다면 씹어먹는 C++ 은 어때요?

istream::sentry

<istream> 에 정의됨

class sentry;

basic_istream::sentry 객체는 std::basic_istream 에서 입력을 수행하는 멤버 함수들에 의해 생성되는 객체이다. sentry 객체의 생성자는, 입력 스트림을 다음 같은 방법으로 준비한다.

sentry 객체가 소멸 될때, 필요한 청소 작업을 수행하는데 이는 입력 연산 중에 예외가 발생하더라도 입력 스트림을 안전하게 마무리 짓기 위함이다.

멤버 함수들

explicit sentry(std::basic_istream<CharT, Traits>& is, bool noskipws = false);

sentry 객체의 생성자는 위와 같은 꼴이다. 만일 is.good()false 라면, is.setstate(failbit) 를 호출한 후에 리턴한다. 그 다음, is.tie() 을 확인해서 널 포인터가 아니라면, is.tie()->flush() 를 호출해서 출력 스트림과 동기화를 수행한다. 이 과정은 is.tie()put area 가 0 이라면 생략된다.

그 후에 noskipws 가 0 이거나 is.flags() & ios_base::skipws 가 0 이 아니라면, 첫 공백 문자가 나타나기 전 까지 모든 공백 문자를 날려버린다. 만일 is.rdbuf()->sbumpc()is.rdbuf()->sgetc()traits::eof() 를 리턴한다면, setstate(failbit | eofbit) 를 호출한다.

실행 예제

#include <iostream>
#include <sstream>

struct Foo {
  char n[5];
};

std::istream& operator>>(std::istream& is, Foo& f) {
  std::istream::sentry s(is);
  if (s) is.read(f.n, 5);
  return is;
}

int main() {
  std::string input = "   abcde";
  std::istringstream stream(input);
  Foo f;
  stream >> f;
  std::cout.write(f.n, 5);
  std::cout << '\n';
}

실행 결과

abcde

참고 자료

첫 댓글을 달아주세요!
프로필 사진 없음
강좌에 관련 없이 궁금한 내용은 여기를 사용해주세요