2010-01-14 4 views
1

이 간단한 코드를 사용하여 기록중인 대용량 로그 파일의 청크를 가져와야합니다. 어떤 시점에서 현재 반환 된 위치를 저장합니다. streampos start = istream :: tellg(); 방법. 나중에 코드에서 시작부터 끝까지 버퍼에서 스트림을 읽어야합니다. 코드는 다음과 약 : 내가 관찰하고있어fstream tellg을 사용하여 스트림의 일부분을 끝까지 읽을 수 있습니다.

streampos start = my_stream.tellg(); 

... // do some stuff with logging 

streampos end = my_stream.tellg(); 
const streamsize size_to_read = (end - start); 
char *buf = new char[size_to_read]; 

lock (m_logReadLock); 
{ 
    my_stream.flush(); 
    my_stream.seekg(start); 
    my_stream.read(buf, size_to_read); 
    size_read = my_stream->gcount(); 
} 
unlock (m_logReadLock); 

효과는 size_readsize_to_read보다작고 스트림이 EOF 플래그가 설정되어 있다는 것입니다. 끝 포인터가 스트림이 끝나는 곳을 정확히 지정하면 안되며 read() 메서드는 정확한 양의 데이터를 반환해야합니까? 괜찮 았어, 나는 eof 플래그를 검사하여 그것을 돌아볼 수있다. 그러나이 효과에 대한 설명은 누구나 제공 할 수 있습니까?

감사합니다.

+0

read()는 크기를 읽는 것을 보증하지 않습니다. –

+0

그 점을 이해하십시오. 질문은 read()가 (end - start보다 작게) 읽히고 스트림의 끝에 도달하는 이유입니다. – ilya1725

+0

그것은 간단한 문자 배열입니다. – ilya1725

답변

1

my_stream 대신 gcountstream_loc에 전화하는 것 같습니다.

+0

죄송합니다. 복사 붙여 넣기 오류가 발생했습니다. – ilya1725

+0

'begin_stream_pos','begin','start' 같은 것을 다른 복사 붙여 넣기 오류로 사용하고 있습니까? – interjay

+0

예, 고의적으로 고마워서 . – ilya1725