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

时间:2014-10-28 05:22:57

标签: c# struct

我想在二进制文件中插入数据.Data是50 struct.i想要将二进制文件中的软音乐文件的功能保存为我可以使用它的数据库。

我为每首歌曲构建了一个结构,并将其插入文件中。 struct contains:

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

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

1 个答案:

答案 0 :(得分:0)

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

此示例定义了一个用于保存数据的结构,您需要自己创建数据。

这些都不是为满足您的特定需求而设计的,而是一般如何保存和回读您定义自己的结构列表

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

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();
    }
}
}