문자 단위의 입력에는 istreambuf_iterator의 사용도 적절하다.

어떤 텍스트 파일을 string 객체에 복사해야 한다고 할때

ifstream inputFile(“file.txt”);
string fileData((istream_iterator<char>(inputFile)),
istream_iterator<char>());
같은 코드를 사용할수 있다.

하지만 ifstream_iterator는 실제 스트림 일기를 수행할때에 operator<< 함수를 사용하며, 기본적으로 이 연산자 함수는 공백문자를 건너 뛴다. 즉 공백 문자를 포함하여 파일을 읽어들이고 싶다면 입력 스트림의 skipws 플래그를 설정해제 한다.
ifstream inputFile(“file.txt”);
inputFile.unsetf(ios::skipws);
string fileData((istream_iterator<char>(inputFile)),
istream_iterator<char>());

하지만 어떤 서식 처리가 없이 그냥 문자열을 읽어 들이는 경우 위의 코드는 계선의 여지가 있다. istream_iterator가 사용하는 operator<< 함수는 서식화 입력을 수행하기 때문에 그에 따른 오버헤드가 존재한다.

즉 서식화 입력이 필요가 없다면 istream_iterator 대신 istreambuf_iterator을 사용할수 있다. istream_iterator<char>가 operator<<를 통해 입력 스트림으로부터 문자를 읽어 들이는 반면 istreambuf_iterator<char> 객체는 스트림 자체의 버퍼를 직접 건드려서 다음 문자를 바로 읽어 들인다.
ifstream inputFile(“file.txt”);
string fileData((istreambuf_iterator<char>(inputFile)),
istreambuf_iterator<char>());

istreambuf_iterator는 간단하게 파일의 내용을 읽어들일뿐만 아니라 istream_iterator에 비교해서 볼때 속도도 빠르다.
ostreambuf_iterator 역시 비슷한 속성을 가지고 있다.(문자단위의 비서식화 출력 스트림 반복자)

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다