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

작성일 : 2011-08-17

이 레퍼런스의 모든 내용은 http://www.cplusplus.com/reference/iostream/ 의 내용을 기초로 하여, Microsoft 의 MSDN 과 Bjarne Stroustrup 의 책 The C++ Programming Language 를 참고로 하여 만들어졌습니다. 이는 또한 저의 개인적인 C++ 능력 향상과 저의 모토인 '지식전파' 를 위해 모든 이들에게 공개하도록 하겠습니다.

아직 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> 헤더파일에 정의되어 있으며 명시적으로 include 를 시켜 주어야만 한다.

 인자들

val

  입력 시퀀스(sequence)에서 문자들을 추출하여 주어진 인자의 타입에 맞게 수치값으로 해석하려 한다. 만일 성공적으로 해석하였다면 그 값은 val 에 저장된다. 데이터가 정확히 어떠한 방식으로 해석될지는 이전에 스트림에 적용된 조작자와, 로케일(locale) 에 의해 결정된다.

sb

  입력 시퀀스로 부터 문자들을 추출하여 End Of File 이 나타나기 전이나, 버퍼가 성공적으로 문자를 삽입(insert)할 때 까지 sb 에 저장한다.

pf

  pf(*this) 를 호출하는데, 보통 조작자 함수이다.

ch

  단일 문자를 추출하여 ch 에 저장한다.

str

  문자를 추출하여 C 형식 문자열로 저장한다. (즉 str 이 문자열의 시작 부분을 가리키고, null 문자로 문자열이 끝난다) 추출은 다음 문자가 공백 문자(whitespace) 이거나 널 문자 혹은 End of file 에 도달하였을 때 종료된다. 입력 받은 문자열 끝에는 자동적으로 널 문자가 붙게 된다.

  이 때 만일 필드의 너비가 0 보다 크게 설정되었다면 (이는 ios_base::width혹은 setw 로 설정할 수 있다)  입력 받을 문자의 수를 제한할 수 도 있다(버퍼 오버플로우 문제를 막기 위해). 이 경우 입력 받은 문자의 수가 필드 너비 값에 도달하기 하나 전에, 입력을 중단하고 나머지 한 문자를 널 종료 문자(null terminating character) 로 채운다. 그리고 자동으로 필드 너비 값이 0 으로 재설정 되버린다.

is

  작업이 수행될 스트림 객체. 이는 전역 함수의 첫 번째 인자로 연산자의 왼쪽에 위치한다.

 리턴값

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

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

플래그오류eofbit작업 중 문자들의 끝에 도달하였을 때failbit입력받은 데이터가 올바른 타입으로 해석이 되지 않을 경우(참고로 eofbit failbit도 참이 된다) badbit위 같은 일들 외의 다른 오류가 발생시(ios_base::iostate 를 참조)

  추가적으로 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);

 연관된 함수

프로필 사진 없음
댓글에 글쓴이에게 큰 힘이 됩니다