以往在vb6,vc6中都有现成的方法将结构类型数据写入和读取到二进制文件中,但是在c#中却没有现成的方法来实现,因此我查阅了一些资料,借鉴了网上一些同学的做法,自己写了个类似的例子来读写结构类型数据到二进制文件中,废话不多说了,先上代码:

using System;

using System.IO;

using System.Runtime.InteropServices;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

string filename = @"d:\testbinary.st";

        #region 结构体

        [StructLayout(LayoutKind.Sequential), Serializable]

        public struct MY_STRUCT

        {

            public double x;          //点的经度坐标

            public double y;          //点的纬度坐标

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)]

            public string Name;        //Name[40]; //名称

            public long PointID;  //点的ID号

            public long TypeCode; //客户不使用该字段

        }

        #endregion

public void WriteInfo(byte[] bt)

        {

            if (File.Exists(filename))

            {

                File.Delete(filename);

                return;

            }

FileStream fs = new FileStream(filename, FileMode.Create);

            BinaryWriter bw = new BinaryWriter(fs);

            bw.Write(bt);

            bw.Flush();

bw.Close();

            fs.Close();

MessageBox.Show("保存成功!");

        }

public byte[] ReadInfo(string file)

        {

            FileStream fs = new FileStream(file, FileMode.Open);

            BinaryReader br = new BinaryReader(fs);

byte[] bt = br.ReadBytes(144);

            br.Close();

            fs.Close();

return bt;

        }

private MY_STRUCT Byte2Struct(byte[] arr)

        {

            int structSize = Marshal.SizeOf(typeof(MY_STRUCT));

            IntPtr ptemp = Marshal.AllocHGlobal(structSize);

            Marshal.Copy(arr, 0, ptemp, structSize);

            MY_STRUCT rs = (MY_STRUCT)Marshal.PtrToStructure(ptemp, typeof(MY_STRUCT));

            Marshal.FreeHGlobal(ptemp);

            return rs;

        }

private byte[] Struct2Byte(MY_STRUCT s)

        {

            int structSize = Marshal.SizeOf(typeof(MY_STRUCT));

            byte[] buffer = new byte[structSize];

            //分配结构体大小的内存空间

            IntPtr structPtr = Marshal.AllocHGlobal(structSize);

            //将结构体拷到分配好的内存空间

            Marshal.StructureToPtr(s, structPtr, false);

            //从内存空间拷到byte数组

            Marshal.Copy(structPtr, buffer, 0, structSize);

            //释放内存空间

            Marshal.FreeHGlobal(structPtr);

            return buffer;

        }

private void button1_Click(object sender, EventArgs e)

        {

            MY_STRUCT[] arr = new MY_STRUCT[2];

MY_STRUCT np = new MY_STRUCT();

            np.x = 112.123456;

            np.y = 21.56789;

            np.Name = "深圳市政府1";

            np.PointID = Convert.ToInt64(1234);

            np.TypeCode = Convert.ToInt64(65);

arr[0] = np;

np = new MY_STRUCT();

            np.x = 113.123456;

            np.y = 22.56789;

            np.Name = "深圳市政府2";

            np.PointID = Convert.ToInt64(1235);

            np.TypeCode = Convert.ToInt64(66);

arr[1] = np;

int structSize = Marshal.SizeOf(typeof(MY_STRUCT));

            byte[] temp = new byte[structSize * arr.Length];

            byte[] temp1 = Struct2Byte(arr[0]);

            byte[] temp2 = Struct2Byte(arr[1]);

Array.Copy(temp1, 0, temp, 0, temp1.Length);

            Array.Copy(temp2, 0, temp, structSize, temp2.Length);

WriteInfo(temp);

}

private void button2_Click(object sender, EventArgs e)

        {

            byte[] bt = ReadInfo(filename);

int structSize = Marshal.SizeOf(typeof(MY_STRUCT));

            int num = bt.Length / structSize;

for (int i = 0; i < num; i++)

            {

                byte[] temp = new byte[structSize];

                Array.Copy(bt, i * structSize, temp, 0, structSize);

MY_STRUCT np = new MY_STRUCT();

                np = Byte2Struct(temp);

            }

}

    }

}



C#中将结构类型数据存储到二进制文件中方法的更多相关文章

  1. MVC中将枚举类型数据应用到下拉列表中的方法

    例如: public enum ItemTypes   {      Movie = 1,      Game = 2,      Book = 3   }    在MVC2.0中如何将以上枚举类型使 ...

  2. MySQL 5.7:非结构化数据存储的新选择

    本文转载自:http://www.innomysql.net/article/23959.html (只作转载, 不代表本站和博主同意文中观点或证实文中信息) 工作10余年,没有一个版本能像MySQL ...

  3. 整型变量修饰符,char类型数据存储原理,字节数,

    //------------------整型变量修饰符 修饰符(int short long longlong signed unsigned)所有修饰符都是用来修整形 int 4short %hd ...

  4. IOS开发数据存储篇—IOS中的几种数据存储方式

    IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...

  5. Android数据存储的五种方法汇总

    本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 ...

  6. DELPHI中枚举类型数据的介绍和使用方法

    在看delphi程序的时候看到aa=(a,b,c,d);这样的东西,还以为是数组,同事说是函数,呵呵,当然这两个都不屑一击,原来这样式子是在声明并付值一个枚举类型的数据.下边写下来DELPHI中枚举类 ...

  7. Android之数据存储的五种方法

    1.Android数据存储的五种方法 (1)SharedPreferences数据存储 详情介绍:http://www.cnblogs.com/zhangmiao14/p/6201900.html 优 ...

  8. Java基础知识强化之IO流笔记46:IO流练习之 把文本文件中数据存储到集合中的案例

    1.  把文本文件中数据存储到集合中      需求:从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合. 分析:      通过题目的意思我们可以知道如下的一些内容,      数据 ...

  9. JAVA之旅(十七)——StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder

    JAVA之旅(十七)--StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder 讲完String,我们来聊聊他的小兄弟 一.StringB ...

随机推荐

  1. WebForm和WinForm取当前根目录的通用的方法[转载]

    转自:WebForm和WinForm取当前根目录的通用的方法 某些环境下用 System.Web.HttpContext.Current.Server.MapPath 取不到目录. 可以用下面两个方法 ...

  2. C# 基础(3)

    跳转语句 Goto(现在一般不使用) 标志位 Flag true false 常量:(不可改变的量) 语法: Const 类型 变量名 = 常量值 在定义时赋值,其他地方不能赋值 枚举 是自己定义了一 ...

  3. php使用位与运算符【&】或【|】实现权限管理

    权限值是这样的2^0=1,相应2进数为”0001″(在这里^我表示成”次方”,即:2的0次方,下同)2^1=2,相应2进数为”0010″2^2=4,相应2进数为”0100″2^3=8,相应2进数为”1 ...

  4. Android相机使用(系统相机、自定义相机、大图片处理)

    本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人Surf ...

  5. 如何获取eID——公安部发行的网络实名认证方式

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  6. smartimageview使用与实现原理

    一.从网络中获取图片的步骤 从网络中获取图片是一个耗时耗资源耗费用户流量的操作,故我们在第一次获取到网络中图片的时候会将其缓存到本地(内存或SD卡),以保证下次再需要这张图片时,可以从本地加载到. 二 ...

  7. [数据结构] N皇后问题

    代码: #include <iostream> #include <string.h> #include <algorithm> using namespace s ...

  8. iOS开发零基础--Swift基础篇--常量&变量的定义

    什么是常量和变量 在Swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量 使用let来定义常量,定义之后不可以修改 使用var来定义变量,定义之后可以修改 常量和变量的使用注意: ...

  9. vmware Esxi 更换管理网卡IP

    使用VMware vSphere Client登录ESXI服务器.如下 在Configuration配置网络--->Networking

  10. iOS手势(滑动)返回的实现(自定义返回按钮)

    如果各位使用的是storyboard布局的话,且用的是系统的返回按钮,那么是自动会有滑动返回效果的,但是相信各位做项目的,一般都是用的自定义的返回按钮,所以我贴几行代码,看看怎么实现系统自带的滑动返回 ...