basic_istream::operator>>

basic_istream::operator>> (문자 · 문자열 추출)

입력 스트림에서 문자(ch)나 문자 배열(s)로 데이터를 추출하는 추출 연산자(>>)들이에요. std::basic_istream 계열이 문자·문자열 입력을 처리하는 방법을 정의해요.

출처: cppreference

본문

<istream> 헤더에 정의돼 있고, 문자 계열 추출용 오버로드예요.

template< class CharT, class Traits >
basic_istream<CharT, Traits>&
    operator>>( basic_istream<CharT, Traits>& st, CharT& ch );   // (1)

template< class CharT, class Traits >
basic_istream<CharT, Traits>&
    operator>>( basic_istream<CharT, Traits>& st, CharT* s );    // (2) (until C++20)

template< class CharT, class Traits, std::size_t N >
basic_istream<CharT, Traits>&
    operator>>( basic_istream<CharT, Traits>& st, CharT (&s)[N] ); // (2) (since C++20)

template< class Istream, class T >
Istream&&
    operator>>( Istream&& st, T&& value );                        // (3) (since C++11)
  • (1,2) 문자 입력 연산을 수행해요.
    • (1) FormattedInputFunction처럼 동작해요. sentry 객체를 만들고 검사한 뒤(선행 공백을 건너뛸 수 있음), 문자 하나를 추출해 ch에 저장해요. 사용할 수 있는 문자가 없으면 failbit를 설정해요(FormattedInputFunction 요구대로 설정되는 eofbit에 더해).
    • (2) FormattedInputFunction처럼 동작해요. sentry 객체를 만든 뒤 연속된 문자들을 추출해 문자 배열에 저장해요. 다음 조건 중 하나가 만족되면 추출이 멈춰요.
      • 공백 문자(ctype 패싯으로 판정)를 만날 때. 공백 문자는 추출되지 않아요.
      • st.width()가 0보다 크면 st.width() - 1개만큼 문자를 저장해요 (until C++20).
      • n - 1개만큼 문자를 저장해요. 여기서 nst.width()가 0보다 크면 std::min(std::size_t(st.width()), N), 아니면 N이에요 (since C++20).
      • 입력 시퀀스에서 파일 끝이 발생할 때 (eofbit도 설정돼요).
    • 어느 경우든 출력 끝에 널 문자 값 CharT()가 하나 더 저장돼요. 추출된 문자가 없으면 failbit를 설정해요(널 문자는 여전히 출력 첫 위치에 쓰여요). 마지막으로 st.width(0)을 호출해 std::setw의 효과가 있으면 취소해요.
  • (3) 입력 스트림 객체의 rvalue 참조가 주어졌을 때 적절한 추출 연산자를 호출해요(st >> std::forward<T>(value)와 같음). st >> std::forward<T>(value)가 well-formed이고 Istreamstd::ios_base에서 공개적이고 명확하게 파생된 클래스 타입일 때만 오버로드 해석에 참여해요.

참고로, 스트림의 마지막 문자인 단일 문자를 추출해도 eofbit가 설정되지 않아요. 이는 마지막 정수를 추출하는 다른 형식화 입력 함수(operator>>)와 다르지만, std::scanf"%c" 형식 지정자 동작과는 일치해요.

  • 매개변수 st: 데이터를 추출할 입력 스트림. ch: 추출한 문자를 저장할 문자 참조. s: 추출한 문자들을 저장할 문자 배열에 대한 (until C++20) 포인터.
  • 반환 값: (1,2) st, (3) std::move(st).

예제를 보면요.

#include <iomanip>
#include <iostream>
#include <sstream>

int main()
{
    std::string input = "n greetings";
    std::istringstream stream(input);

    char c;
    const int MAX = 6;
    char cstr[MAX];

    stream >> c >> std::setw(MAX) >> cstr;
    std::cout << "c = " << c << '\n'
              << "cstr = " << cstr << '\n';

    double f;
    std::istringstream("1.23") >> f; // rvalue 스트림 추출
    std::cout << "f = " << f << '\n';
}

출력은 다음과 같아요.

c = n
cstr = greet
f = 1.23

결함 보고가 여러 번 있었어요. LWG 13(C++98, n의 정의가 존재하지 않는 eos를 언급 → CharT()로 교체), LWG 68(C++98, (2)에서 출력 끝에 널 문자를 저장하지 않음 → 저장), LWG 1203(C++98, rvalue 스트림 오버로드가 기반 클래스의 lvalue 참조를 반환 → 파생 클래스의 rvalue 참조 반환), LWG 2328(C++98, rvalue 오버로드가 다른 인자도 lvalue일 것을 요구 → rvalue 허용), LWG 2534(C++98, rvalue 오버로드가 제약되지 않음 → 제약 추가) 등이 있어요.

더 알아보기 (Learn more)

cppreference