从c#中的二进制文件中读取多个结构

本文关键字:读取 结构 二进制文件 | 更新日期: 2023-09-27 18:28:07

我想在二进制文件中插入数据。数据是50结构。我想把软音乐文件的特性保存在二进制文件中作为我可以使用的数据库。

我为每首歌构建了一个结构,并将其插入到文件中。结构包含:

public struct  s {
    public byte class_no;
    public int sample_no;
    public byte [] template;
}

其中模板是大小为4410的一维数组我的文件现在包含50个结构,我想使用二进制文件读取它,并使文件中所有结构的结构数组

从c#中的二进制文件中读取多个结构

我将回答从文件中读取多个结构。

这个示例定义了一个用于保存数据的结构,您将需要使用该结构进行自己的操作。

这些都不是为你的特定需求而设计的,而是作为一个通用的如何保存和读回你定义自己的的结构列表

完整的代码,你可以复制并粘贴到一个新的控制台应用程序项目:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
//where the magic lives
using System.Runtime.Serialization.Formatters.Binary;
namespace savecon
{
class Program
{
    static void Main(string[] args)
    {
        Random rand = new Random();
        byte[] data = new byte[20];
        rand.NextBytes(data);
        DataObj a = new DataObj(data);
        DataObj b = new DataObj(data);
        DataCollection dc_old = new DataCollection();
        dc_old.Add(a);
        dc_old.Add(b);
        DataCollection.ToFile("D:''data.my",dc_old);//I use D: drive yours will be different
        DataCollection dc_new = DataCollection.FromFile("D:''data.my");

    }
}
[Serializable]//the magic
struct DataObj
{ 
    byte[] data;
    public DataObj(byte[] d)
    {
        data = d;
    }
}

[Serializable]//more magic
class DataCollection : IEnumerable<DataObj>
{
    List<DataObj> dataobjects;//list<> is Attributed with Serializable as well
    public DataCollection()
    {
        dataobjects = new List<DataObj>();
    }

    public static DataCollection FromFile(string path)
    {
        DataCollection dcol;
        using (FileStream FS = File.OpenRead(path))
        {
            dcol = (DataCollection)new BinaryFormatter().Deserialize(FS); // magic happening
        }
        return dcol;
    }

    public static void ToFile(string path,DataCollection DC)
    {
        using (FileStream FS = File.Open(path, FileMode.Create, FileAccess.ReadWrite))
        {
            new BinaryFormatter().Serialize(FS, DC);
        }
    }

    public void Add(DataObj dobj)
    {
        dataobjects.Add(dobj);
    }


    //note that Ienumerable does not matter for serializing (saving the data)
    public IEnumerator<DataObj> GetEnumerator()
    {
        return dataobjects.AsEnumerable().GetEnumerator();
    }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return dataobjects.GetEnumerator();
    }
}
}