책 정리/Effective STL
항목 29 : 문자 단위의 입력에는 istreambuf_iterator의 사용도 적절하다.
최익필
2008. 7. 27. 21:11
내가 STL에 조예가 깊어서 글을 남기는 것이
아니라, Effecitve STL 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면
지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다. - 최익필
이번 주제는 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 영문
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 영문