SW/C++

c++ : istreambuf_iterator와 istream_iterator의 차이점

얇은생각 2019. 8. 23. 18:30
반응형
istream_iterator 와 istreambuf_iterator
std::istream_iterator는 형식화된 추출을 위한 반복자입니다. 예를 들어, 파일 안 내용에 정수가 있고 컨테이너에 복사하려면 std::istream_iterator<int>를 사용하면 int에서 추출한 값을 내부적으로 컨테이너에 복사합니다.  (연산자 >>() 사용)

std::copy(std::istream_iterator<int>(file), std::istream_iterator<int>(), std::back_inserter (some_container));


std::istreambuf_iterator는 형식화되지 않은 추출을 위한 반복자입니다. 생성자를 통해 제공된 std::streambuf 객체에서 직접 작동합니다. 따라서 파일 형식에 대해 걱정하지 않고 파일의 내용이 필요하면 이 반복자를 사용하면 됩니다. 예를 들어, 전체 파일을 문자열이나 컨테이너로 읽으려고 하는 경우가 있습니다. 이런 경우, 정규 형식의 추출기는 앞 공백을 버리고 추출된 토큰만을 변환합니다. 하지만 버퍼 이터레이터는 다르게 동작합니다.


std::string str(std::istreambuf_iterator<char>{file}, {});


반복자는 어디를 가리키고 있을까요?


기본 생성 스트림 반복자는 단순히 스트림의 끝을 나타내는 특수한 센티넬 객체입니다. IOStream은 하나의 패스이므로 해당 지점까지 읽을 때까지 실제로 끝을 가리킬 수 있는 방법이 없습니다. 내부적으로 추출에 실패하거나 읽기가 파일 끝에 도달할 떄 스트림 (또는 스트림 버퍼)으로 구성된 반복자는 종료 스트림 반복자로 변경됩니다. 이것은 표준 알고리즘이 외부에서 일반 반복자처럼 작동하기 때문에 스트림 반복자와 함께 이해하는 데 도움이됩니다.


저는 파일명을 그대로 읽어와야 할떄는 아래를 사용합니다. 하지만 특정한 자료형태로 읽어와야 하는 경우에는 위 방식을 활용하고 있습니다. 


관련된 정보들은 어디에서 확인할 수 있을까요? 많은 곳에서 확인을 할 수 있습니다. 하지만, 공식적으로 표준 cppreference에서 관련 설명을 찾을 수도 있습니다.

반응형