본문 바로가기

프로그래밍/Modern C++

[C++] 스트림 반복자(stream iterator)-입력/출력

 

 

 

서론

스트림 반복자(stream iterator)는 입력 스트림 반복자(istream_iterator)이면 스트림에서 읽고,

출력 스트림 반복자(ostream_iterator) 이면 스트림에 쓰는 단일 패스 반복자(single pass iterator)이다.

이 두 가지의 특징은 다음과 같다.

종류 특징
입력 스트림 반복자(istream_iterator)

 1. 스트림에서 데이터를 텍스트 모드로 추출할 수 있는 입력      반복자이다. 바이너리 스트림과는 사용할 수 없다.

 2. 시작 반복자는 읽어올 첫 번째 값을 가리키고, 끝 반복자는 파일의 끝(end-of-file, EOF) 스트림 상태일 때 알아낼         수 있다. 

 3.  단일 패스 반복자(single pass iterator)이다.

출력 스트림 반복자(ostream_iterator)

 1.  타입 T의 객체를 텍스트 모드로 출력 스트림에 쓸 수 있는 출력 반복자이다.

 2. 단일 패스 반복자(single pass iterator)이다.

 

입력 스트림 반복자(istream_iterator)                                      

iterator 헤더에 정의된 istream_iterator 템플릿은 (>>)연산자를 사용해서 스트림에서 타입 T의 값을 읽어 들인다. 

이렇게 동작하려면 istream 객체에서 타입 T의 값을 읽어올 수 있도록 operator>>() 함수 오버로드가 정의되어 있어야 한다. 기본적으로 스트림은 char 타입의 문자들을 담고 있다고 가정한다.

입력 스트림 반복자 생성

입력 스트림 객체를 생성자에 전달해서 istream_iterator 객체를 생성할 수 있다. 다음은 입력 스트림 반복자를 생성한다.

기본적으로 스트림은 char 타입의 문자들을 담고 있다고 가정하므로 다른 타입의 문자들을 담은 스트림을 읽으려면 

입력 스트림 반복자를 정의해야 한다. 아래는 wchar_t 타입을 받는 스트림 반복자를 생성하는 방법이다.

  1. 첫 번째 문장은 whcar_t 문자로 된 입력 파일 스트림을 정의한 것이다. 
  2. 두 번째 문장은 파일을 읽기 위해 스트림 반복자를 정의한다. 스트림의 문자 타입은 istream_iterator의 두 번째 인자에 타입 인수를 지정하였으며 여기서는 wchar_t로 지정했다. 스트림에서 읽어올 객체의 타입을 지정하는         첫 번째 인수도 wstring이어야 하는데 이는 wstring이 wchar_t 문자들의 문자열 타입이기 때문이다.
입력 스트림 반복자 예시

결과

cin에서 int 타입의 값을 읽을 수 있는 입력 스트림 반복자를 생성했다. 

루프는 스트림 상태가 EOF가 될 때까지 입력 스트림 반복자를 사용해서 값을 모두 읽어서 더한다.

 

 

출력 스트림 반복자(ostream_iterator)   

입력 스트림 반복자 예시

iterator 헤더에 정의된 ostream_iterator 템플릿은 (<<) 연산자를 사용해서 스트림에서 타입 T의 값을 읽어 들인다.

이렇게 동작하려면 istream 객체에서 타입 T의 값을 쓸 수 있도록 operator<<() 함수 오버로드가 정의되어 있어야 한다.

 

첫 번째 인자에는 쓰려는 값의 타입을

두 번째 인자에는 스트림의 문자 타입을 넣으면 된다. 두 번째 인자의 기본값은 char이다.

출력 스트림 반복자 예시

결과

 

words 컨테이너를 출력 스트림 반복자를 이용해서 출력하는 예제이다. 

한 가지 주의 사항이 있는데 

string 타입에 문자 타입을 넣으려고 하면 오류가 발생하게 된다.

 

사용자 정의 자료형(user defined) 기반 스트림 반복자

www.colorscripter.com/info#e"

결과

어떤 클래스 타입이라도 스트림 반복자를 사용하려면 삽입 연산자(<<)와 추출 연산자(>>)를 반드시 오버 로드해야 한다. 

 

출처 및 레퍼런스

Book: C++14 STL철저 입문 아이버 호튼, 조현태