尝试从二进制文件中读取简单记录结构,但收到以下错误消息。有什么问题?
未处理的类型' 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);
{
...
}
但我得到同样的错误。
答案 0 :(得分:2)
尝试交换
myBooks.bookid = readerFromFile.ReadInt16();
与
myBooks.bookid = readerFromFile.ReadInt32();
默认情况下,int
是System.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出来。