2010-01-14 3 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_read является меньше, чемsize_to_read и поток имеет установленный флаг ВФ. Должен ли конечный указатель точно указать, где заканчивается поток, и метод read() возвращает точный объем данных? Это нормально, я могу обойти его, проверив флаг eof. Однако может ли кто-нибудь дать объяснение этому эффекту?

Спасибо.

+0

читать() не гарантирует, что размер вы дадите. – 2010-01-14 20:05:55

+0

В понимании этого. Вопрос в том, почему read() читает меньше (end-start) и достигает конца потока? – ilya1725

+0

это простой массив символов. – ilya1725

ответ

1

Вы, кажется, звоните gcount по телефону stream_loc вместо my_stream.

+0

Извините, скопируйте ошибку патча. – ilya1725

+0

Использует 'begin_stream_pos',' begin' и 'start' за то же самое, что и другая ошибка с копированием папок? – interjay

+0

Да, благодарит за уведомления. – ilya1725

Смежные вопросы