BinaryReader - 读取返回1条记录而不是多条记录

时间:2014-10-24 16:03:35

标签: c# .net binaryreader binarywriter

我正在使用BinaryWriter将数据写入日志文件。

然而,当我使用BinaryReader检索数据(在一个循环中)时,我能够读取前3个写入(整数,整数,byte []),但是循环中的下一次迭代才能读取另外3个看起来似乎抓住剩下的数据(我无法处理它)。

以下是代码:

编写代码:

writer.Write(header.StructID);
writer.Write(data.Length);
writer.Write(data);

阅读代码:

using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (BinaryReader br = new BinaryReader(fs))
    {
        long bytesRead = 0;
        long readerLen = br.BaseStream.Length;

        //read 1st record
        int id = br.ReadInt32();
        int len = br.ReadInt32();
        byte[] data = br.ReadBytes(len);
        bytesRead += (sizeof(int) * 2) + data.Length;

        while (bytesRead < readerLen)
        {
            //TODO:process data

            //read next
            id = br.ReadInt32();
            len = br.ReadInt32();
            data = br.ReadBytes(len);
            bytesRead += (sizeof(int) * 2) + data.Length;
        }
    }
}

感谢您解决问题的帮助!

编辑:

我将二进制写入代码包含在using语句中,并且我只允许它执行一次,因此我确切地知道写入了多少字节。当我处理读取代码时,basestream.length更大(即我写80字节,basestream.length显示1144)。

    using (writer = new BinaryWriter(File.Open(filename, FileMode.OpenOrCreate)))
            {
                long pos = writer.BaseStream.Position;
                writer.Write(header.StructID);
                writer.Write(data.Length);
                writer.Write(data);
                m_LoggingEnabled = false;
            }

这是二进制数据:

CE 00 00 00 48 00 00 00 AD A2 3B 94 76 08 A7 3E 7A 9A 80 9D CC 1A 2B 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 BF 91 01 00 00 00 00 00 00 00 00 00 00 00 00 F0 3F 01 00 00 00 00 00 00 00 CE 00 00 00 48 00 00 00 AD A2 3B 94 76 08 A7 3E 7A 9A 80 9D CC 1A 2B 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 BF 92 01 00 00 00 00 00 00 00 00 00 00 00 2A 7A BE 01 00 00 00 50 64 63 3D CE 00 00 00 48 00 00 00 D8 41 B1 19 01 A3 86 BE E2 E2 7A 22 6F 1F 2B 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 BF 91 01 00 00 00 00 00 00 00 00 00 00 00 00 F0 3F 01 00 00 00 00 00 00 00

我现在真的很困惑!

1 个答案:

答案 0 :(得分:1)

您的BinaryReader代码是正确的,即使您可以将其重构为重复性更低且更简洁。

根据你的有限描述,我假设你写错了,而不是阅读。确保header.StructIDdata.Length是整数类型。

由于您从Timer调用BinaryReader,因此您必须知道Write操作将从现有文件的开头写入,因为您尚未将写入流提前到正确的位置。这可能会导致一些不必要的行为(覆盖现有数据等)和,这可能会导致您的阅读问题。您应该以{{1​​}}模式打开文件以防止这种情况发生。

以下是基于您的示例使用BinaryReader和BinaryWriter进行编写和读取的正确示例。它在文件上使用AppendMode来防止你看到的问题(我在for循环中重新打开文件以模拟你的计时器重新打开文件并写入文件):

Append