0

テキスト ファイルを 1 行ずつ読み取り、現在の位置 m_numBytesRead を保存するコードを次に示します。そのため、ループを中断し (大きなファイルのチャンクでテキスト解析を分割する場合)、m_numBytesRead-1 の Seek を作成して 2 回目にアクセスしようとすると、ReadString は期待どおりに行の先頭を取得しません。 .

CStdioFile fileLog;
if (fileLog.Open(m_strReadFileName, CFile::modeNoTruncate | CFile::modeRead | CFile::shareDenyNone))
{
    if (m_numBytesRead > 0)
        fileLog.CStdioFile::Seek(m_numBytesRead-1, CFile::begin);

    bool bBreakLoop = false;
    while (fileLog.ReadString(strLine) && !bBreakLoop)
    {

        // any condition to set bBreakLoop after few MB read...

        if (!bBreakLoop)
        {
            m_numBytesRead = fileLog.CStdioFile::GetPosition();
        }
    };
    fileLog.Close();
}

詳細にデバッグし、Notepad ++ で取得したインデックスと比較すると、CStdioFile::GetPosition() が正しい値を与えていないようで、新しい行の先頭が読み取られますが、数バイト (私の場合は 12) 以上です。 ..

MFC のバグですか、それとも何か不足していますか? 誰かが同様の問題を見ていますか?

Windows 7 で VS2010 を使用していることに注意してください。

4

1 に答える 1

3

オープン モードを追加してCFile::typeBinary、正確なバイト オフセットを取得します。デフォルトのモードはテキストで、オフセットを台無しにする可能性のある改行変換を実行します。

于 2015-10-05T08:09:43.800 に答える