使用 fstreamtellg 读取流的一部分直到结束

发布于 2024-08-18 06:19:30 字数 710 浏览 6 评论 0原文

我有这个简单的代码,需要获取正在写入的大型日志文件的一部分。在某些时候,它会存储从返回的当前位置 流位置开始 = istream::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 标志来解决这个问题。 然而,谁能解释一下这种效应呢?

谢谢。

I have this simple code that needs to get a chunk of a large log file that is being written into. At some point it stores the current location returned from
streampos start = istream::tellg();
method.
Later on the code has to read from the stream a buffer from the start till the end. The code is approximately like this:

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);

The effect that I'm observing is that size_read is smaller than size_to_read and the stream has its eof flag set. Shouldn't the end pointer specify exactly where the stream ends and read() method return that exact amount of data?
It is fine, I can work round it by checking the eof flag.
However, can anyone provide the explanation for this effect?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

稀香 2024-08-25 06:19:30

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

You seem to be calling gcount on stream_loc instead of my_stream.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文