【问题标题】:I'm trying to read from a custom file type in C#我正在尝试从 C# 中的自定义文件类型中读取
【发布时间】:2019-01-31 02:06:39
【问题描述】:

我正在尝试从我创建的自定义文件类型中读取和写入,如下所示:

public static byte[] writeTo(Structures.SearchDS s)
{
    var o = new MemoryStream();
    var b = new BinaryWriter(o);

    b.Write(s.magic);
    b.Write(s.name);
    b.Write(s.age);
    b.Write(s.b.ElementAt(0).Houseno);
    b.Write(s.b.ElementAt(0).location);

    return o.ToArray();
}

public static Structures.SearchDS readSearchFile(byte[] a)
{
    MemoryStream ms = new MemoryStream(a);
    BinaryReader br = new BinaryReader(ms);
    Structures.SearchDS ss = new Structures.SearchDS();
    ss.magic=br.ReadChars(5);
    ss.name = br.ReadString();
    ss.age = br.ReadUInt16();
    ss.b[0] = new Structures.House();
    ss.b[0].Houseno = br.ReadString();
    ss.b[0].location = br.ReadString();

    return ss;
}

主要方法:

public static void Main(string[] args)
{
    Console.WriteLine("Hello World!");

    // TODO: Implement Functionality Here

    byte[] testFile=Tools.writeTo(Tools.adding());
    File.WriteAllBytes("test3.search", testFile);

    Structures.SearchDS ss1 = Tools.Write(File.ReadAllBytes("test.search"));
    Console.WriteLine(ss1.age);
    Console.WriteLine(ss1.name);
    Console.WriteLine(ss1.magic);

    ss1.b[0] = new Structures.House();

    Console.WriteLine(ss1.b.ElementAt(0).Houseno);
    Console.WriteLine(ss1.b.ElementAt(0).location);
    Console.Write("Press any key to continue . . . ");
    Console.ReadKey(true);
}

但我不断收到异常:

流结束异常

ss.name = br.ReadString();

我用十六进制编辑器打开文件,我看到我的数据写入正确,文件流同时出现以下异常

“ms.WriteTimeout”引发了“System.InvalidOperationException”类型的异常

“ms.ReadTimeout”引发了“System.InvalidOperationException”类型的异常

我的数据结构是:

public class SearchDS
{
    public char[] magic = { 'S', 'E', 'A', 'R', 'C', 'H' };
    public string name;
    public UInt16 age;
    public House[] b = new House[1];
}

public class House { public string Houseno; public string location; }    

【问题讨论】:

  • 使用调试器查看错误是什么。
  • 使用 Visual Studio 挖掘异常。通常你会发现类似内部异常的东西会给你一个更具体的错误。
  • 我做了每个对象都被完美初始化,除了读取端的对象。所有数据都写得很完美,但它不会读取字符之外的任何内容这是异常我无法动摇它甚至意味着什么“ms.WriteTimeout”抛出了“System.InvalidOperationException”类型的异常“ms.ReadTimeout”抛出我挖了一个“System.InvalidOperationException”类型的异常,消息说“此流不支持超时”
  • @RobertHarvey 指的是this
  • 你只是到达了流的末尾吗?

标签: c#


【解决方案1】:

您使用“SEARCH”六个字符初始化magic,但您使用5调用ReadChars。这会导致下一个读取字符串不正确; ReadString 尝试获取要读取的长度,该长度将使用 char H 进行初始化(其中一部分......字符串是 Unicode)。该长度超过了您可以使用的剩余长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多