2010-03-14 3 views
2

파일에서 공백으로 구분 된 단어 단위로 단어를 읽으려는 응용 프로그램이 있습니다. 이 줄에 따라 코드를 사용하고 있습니다.내 자신의 iostream 유틸리티 클래스 작성 : 좋은 생각인가요?

std::istream in; 
string word; 
while (in.good()) { 
    in>>word; 
    // Processing, etc. 
    ... 
} 

제 문제는 단어 자체에 대한 처리는 실제로 다소 가벼운 것입니다. 주요 고객은 내가 실행하는 mySQL 쿼리 세트입니다.

내가 생각했던 것은 파일에서 킬로바이트와 같은 것을 읽고, 문자열 스트림을 버퍼로 초기화하며, 많은 IO 작업을 피하기 위해 투명하게 추출을 수행하는 버퍼링 된 클래스를 작성하는 것입니다.

생각과 조언?

+0

'istream_iterator '을 (를) 찾고 있습니다. BTW,'.good() 테스트는 잘못된 것을합니다. 'in >> word' 자체를 확인하고 싶습니다. –

+0

고맙습니다. 또한, 파일의 끝까지 읽었으므로 일단 끝나면 좋은() eof를 반환하지 않아야합니까? – Alex

+0

내가 실수하지 않는다면 입력이 공백으로 끝나는 지 아닌지에 달려 있습니다. 'while (in >> word)'두 경우 모두에서 작동합니다. – UncleBens

답변

2

istream은 버퍼 클래스와 함께 작동하므로 일반적으로 상당히 큰 청크로 읽혀집니다 (정확한 크기는 보장되지 않지만). 이와 같이, 당신은 이미 당신이 찾고있는 효과를 얻고있을 것입니다. 버퍼링을 독자적으로 처리하면 다소 어렵지 않습니다. 버퍼의 끝에 도달하면 단어의 중간에있을 가능성이 있으므로 현재 단어를 다음으로 복사해야합니다. 귀하의 버퍼의 시작 부분과 그 단어를 처리하기 전에 버퍼의 나머지 부분을 채우기 위해 더 많은 것을 읽으십시오.

기회는 당신이 단지 같은 수정 루프를 사용해야 있습니다

while (in>>word) { 
    // process word 
} 

을 ...하지만 당신은 조금 이제 stringstream에 직접 파일을 읽고, 거기에서 단어를 처리하여 속도를 향상시킬 수 있습니다 :

std::istream in; 
std::istringstream buffer; 

buffer << in.rdbuf(); 
while (buffer >> word) { 
    // process word 
} 

이것은 매우 큰 입력 파일로 인해 해로울 수 있습니다.

관련 문제