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개만큼 문자를 저장해요. 여기서n은st.width()가 0보다 크면std::min(std::size_t(st.width()), N), 아니면N이에요 (since C++20).- 입력 시퀀스에서 파일 끝이 발생할 때 (
eofbit도 설정돼요).
- 공백 문자(ctype
- 어느 경우든 출력 끝에 널 문자 값
CharT()가 하나 더 저장돼요. 추출된 문자가 없으면failbit를 설정해요(널 문자는 여전히 출력 첫 위치에 쓰여요). 마지막으로st.width(0)을 호출해std::setw의 효과가 있으면 취소해요.
- (1)
- (3) 입력 스트림 객체의 rvalue 참조가 주어졌을 때 적절한 추출 연산자를 호출해요(
st >> std::forward<T>(value)와 같음).st >> std::forward<T>(value)가 well-formed이고Istream이std::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 오버로드가 제약되지 않음 → 제약 추가) 등이 있어요.