모두의 코드
C++ 레퍼런스 - istream::operator>> (추출 연산자)

작성일 : 2011-08-17 이 글은 2093 번 읽혔습니다.

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

istream::operator>>

istream& operator>>(bool& val);
istream& operator>>(short& val);
istream& operator>>(unsigned short& val);
istream& operator>>(int& val);
istream& operator>>(unsigned int& val);
istream& operator>>(long& val);
istream& operator>>(unsigned long& val);
istream& operator>>(float& val);
istream& operator>>(double& val);
istream& operator>>(long double& val);
istream& operator>>(void*& val);

istream& operator>>(streambuf* sb);

istream& operator>>(istream& (*pf)(istream&));
istream& operator>>(ios& (*pf)(ios&));
istream& operator>>(ios_base& (*pf)(ios_base&));

// 아래 함수들은 멤버들이 아니라, 전역 함수들이다.

istream& operator>>(istream& is, char& ch);
istream& operator>>(istream& is, signed char& ch);
istream& operator>>(istream& is, unsigned char& ch);

istream& operator>>(istream& is, char* str);
istream& operator>>(istream& is, signed char* str);
istream& operator>>(istream& is, unsigned char* str);

서식화 된 데이터를 추출(extract)한다.

연산자(>>) 은 입력 스트림에서 사용되는데, 추출 연산자(extraction operator) 이라 불리기도 한다. 이 연산자는 스트림에서 데이터의 해석을 필요로 하는 입력 작업을 수행하게 된다.

예를 들어, 입력 받은 숫자 데이터 (문자 형태로 입력될 것이다) 를 사용자가 지정한 수치 형태로 변환한다든지 등 말이다.

참고적으로 3 가지 종류의 멤버 함수들과, 한 가지 종류의 전역 함수들이 istream객체에 적용되는 추출 연산자에서 오버로드 된다.

이 함수들이 연산자 오버로딩 함수들이기 때문에 이 연산자를 사용하기 위해서는

strm >> variable;

와 같이 사용하면 된다. 이 때 strmistream 객체의 이름이고, variable 은 우변으로 전달되는 인자이다. 물론 이 연산자를 아래처럼 쭉 이어나가서 사용해도 된다.

strm >> variable1 >> variable2 >> variable3;  //...

이는 strm 객체에 추출 연산을 계속 진행하는 것과 다름 없다.

표준 istream객체에 사용시 효과가 있는 조작자들은

다른 조작자들도 istream객체에 사용 가능하지만 효과는 없다.

아래의 인자를 가지는 조작자들은 istream 객체에 영향이 있다. 이들은 <iomanip> 헤더파일에 정의되어 있으며 명시적으로 포함 시켜 주어야만 한다.

 인자들

 리턴값

객체 자기 자신을 리턴한다 (*this)

발생된 오류는 내부 플래그를 변화시키게 된다.

플래그

오류

eofbit

작업 중 문자들의 끝에 도달하였을 때

failbit

끝에 바로 도달해버려서 어떠한 문자도 추출해 낼 수 없을 경우. 혹은 n - 1 개의 문자들을 모두 추출하여서 입력 작업이 중단되었을 경우에도 설정된다. 또한 일부 eofbit 를 설정하는 오류들이 failbit 도 설정할 수 있다.

badbit

위 같은 일들 외의 다른 오류가 발생시

추가적으로 ios::exceptions 의 멤버 함수를 통해 적절하게 플래그가 설정되어있다면, 위와 같은 상황 발생 시 ios_base::failure 예외가 throw 된다.

 실행 예제

/*

cin 으로 여러 작업을 수행한다.
이 예제는
http://www.cplusplus.com/reference/iostream/istream/operator%3E%3E/
에서 가져왔습니다.

*/
#include <iostream>
using namespace std;

int main() {
  int n;
  char str[10];

  cout << "Enter a number: ";
  cin >> n;
  cout << "You have entered: " << n << endl;

  cout << "Enter a hexadecimal number: ";
  cin >> hex >> n;  // manipulator
  cout << "Its decimal equivalent is: " << n << endl;

  cout << "Enter a word: ";
  cin.width(10);  // limit width
  cin >> str;
  cout << "The first 9 chars of your word are: " << str << endl;

  return 0;
}

실행 결과

 템플릿 전역 함수들

template <class charT, class traits>
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is,
                                         charT& ch);

template <class charT, class traits>
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is,
                                         signed char& ch);

template <class charT, class traits>
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is,
                                         unsigned char& ch);

template <class charT, class traits>
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is,
                                         charT* str);

template <class charT, class traits>
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is,
                                         signed char* str);

template <class charT, class traits>
basic_istream<charT, traits>& operator>>(basic_istream<charT, traits>& is,
                                         unsigned char* str);

 참고 자료

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