从二进制文件读取错误

时间:2016-01-05 16:10:38

标签: c# binaryfiles

尝试从二进制文件中读取简单记录结构,但收到以下错误消息。有什么问题?

  

未处理的类型' System.IO.EndOfStreamException'   发生在mscorlib.dll

     

其他信息:无法在流的末尾阅读。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace Reading_from_Binary_File
{
    class Program
    {
        struct TBook
        {
            public string author;
            public string title;
            public string genre; //TGenreTypes genre;
            public int bookid;
        };

        static void Main(string[] args)
        {
            FileStream currentFile;
            BinaryReader readerFromFile;
            currentFile = new FileStream("Test.bin", FileMode.Open);
            readerFromFile = new BinaryReader(currentFile);

            TBook myBooks;
            do
            {
                //Now read from file and write to console window
                 myBooks.title = readerFromFile.ReadString();
                 myBooks.author = readerFromFile.ReadString();
                 myBooks.genre = readerFromFile.ReadString();
                // myBooks.genre = (TGenreTypes)Enum.Parse(typeof(TGenreTypes),readerFromFile.ReadString());
                myBooks.bookid = readerFromFile.ReadInt16();
                Console.WriteLine("Title: {0}", myBooks.title);
                Console.WriteLine("Author: {0}", myBooks.author);
                Console.WriteLine("Genre: {0}", myBooks.genre);
                Console.WriteLine("BookID: {0}", myBooks.bookid);
            }
            while (currentFile.Position < currentFile.Length);

            //close the streams
            currentFile.Close();
            readerFromFile.Close();

            Console.ReadLine();
        }
    }
}

更新 我也试过

while (currentFile.Position < currentFile.Length);
{
    ...
}

但我得到同样的错误。

2 个答案:

答案 0 :(得分:2)

尝试交换

myBooks.bookid = readerFromFile.ReadInt16();

myBooks.bookid = readerFromFile.ReadInt32();

默认情况下,intSystem.Int32的别名。

在你的结构中

struct TBook
{
    public string author;
    public string title;
    public string genre; //TGenreTypes genre;
    public int bookid;
};

您已指定int bookid,然后是System.Int32。 因此,只读取2 bytes而不是4 bytes会导致流中有2 bytes。所以循环不会破坏。在循环中,您将尝试读取另一个不存在的“数据集”(仅2个字节)。

答案 1 :(得分:1)

反转你的行为......一会儿(做)就像这样:

while (currentFile.Position < currentFile.Length)            
{
    //Now read from file and write to console window
    . . .
}

以这种方式,进行测试以达到危险区域&#34;在实际尝试访问该位置之前。如果您在尝试之后等待检查,则最后一次尝试(如您发现的那样)将失败。

您可能希望捷克this出来。