1

書き込まれている大きなログファイルのチャンクを取得する必要があるこの単純なコードがあります。ある時点で、streamposから返された現在の場所を保存しますstart = 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フラグをチェックすることによってそれを回避することができます。しかし、誰かがこの効果の説明を提供できますか?

ありがとう。

4

2 に答える 2

1

の代わりに呼び出しgcountているようです。stream_locmy_stream

于 2010-01-14T20:08:02.643 に答える
0

http://groups.google.com/group/comp.lang.c++/browse_thread/thread/709cde3942e64d6c#

于 2010-01-22T03:06:35.237 に答える