2010-01-14 60 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()不能保证读取你给它的大小。 – 2010-01-14 20:05:55

+0

明白了。 问题是为什么read()读取小于(结束 - 开始)并达到流结束? – ilya1725 2010-01-15 03:52:10

+0

它是一个简单的char数组。 – ilya1725 2010-01-15 04:05:38

回答

1

您似乎在stream_loc而不是my_stream上调用gcount

+0

对不起,复制粘贴错误。 – ilya1725 2010-01-14 20:12:55

+0

正在使用'begin_stream_pos','begin'和'start'作为另一个副本粘贴错误? – interjay 2010-01-14 20:16:42

+0

是的, 感谢您的注意。 – ilya1725 2010-01-14 20:40:39