내가 STL에 조예가 깊어서 글을 남기는 것이 아니라, Effecitve STL 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면 지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다.  - 최익필

사용자 삽입 이미지

Stream Library 관계도



이번 주제는 istream_iterator의 사용보다 istreambuf_iterator의 사용이 더 좋을 수가 있다. 는 것이다.
이유는 istream_iterator 가 operator>>를 이용하기 때문이다.
operator>>는  서식화 입력(formatted input)을 수행 한다.
쉽게 생각해서, 자질구레한 뒷처리를 다 해준다.

하지만 istreambuf_iterator는 stream 자체의 버퍼를 직접 건드려서 문자들을 바로 읽는다.
(s.rdbuf()->sgetc()를 호출해서 s의 다음 문자를 읽는다고 한다.)

그래서 더 빠르다!

그렇다면 어떻게 사용하는지 소스코드를 보자. 주석은 istream_iterator를 사용해본 흔적이다.

보면,
1. ifstream 객체 inputFile 을 생성(생성자 단계에서 파일을 읽을 수 있으나 명시적으로 open을 써준다.)
2. inputFile.open() 을 이용하여 파일에 접근 한다.
3. istreambuf_iterator<char>() 로 파일의 끝과
4. istreambuf_iterator<char>(inputFile) 을 이용하여 inputFile이 가리킨 파일의 첫번째 istreambuf_iterator를 만든다.
5. string 객체 생성시 이 이터레이터를 전달하여 다 밀어 넣는다.
6. 그리고 출력 한다.

주석의 내용
1. inputFile.unsetf( std::ios::skipws ); 는 istream_operator 를 이용 하려 할때, 띄어쓰기, 건너쓰기, 등의 문자까지 읽겠다는 표현이다.

2.
std::string fileData( ( std::istream_iterator<char>( inputFile ) ),
std::istream_iterator<char>( ) );
요것들은 위의 부분과 일맥 상통하나, operator>> 를 통하여 받아 들인다.


이것 만은 잊지 말자!
1. 서식화 입력 방식이 필요 없을 때는 istreambuf_iterator 를 고려하자.
2. ostreambuf_iterator 와 짝이니 이것도 알아 두자.^^


관련링크
http://www.filewiki.net/tc/entry/stdostreambuf_iterator-stdistreambuf_iterator 이유.
http://stdcxx.apache.org/doc/stdlibref/istream-iterator.html <-- istream_iterator 설명 영문
http://roadster.egloos.com/273828 <-- 나와 비슷한 내용
http://msdn.microsoft.com/en-us/library/daf5x844(VS.80).aspx <-- MSDN
http://www.cplusplus.com/reference/misc/iterator/istreambuf_iterator.html <-- istreambuf_iterator 영문




  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기