当前位置: 代码迷 >> C# >> c#怎么读取结构体文件
  详细解决方案

c#怎么读取结构体文件

热度:189   发布时间:2016-05-05 02:43:45.0
c#如何读取结构体文件
我有一个二进制结构体文件:格式为:
typedef struct
{
char  STDATA[9];
char  STIME[7];
int   MONI_FLAG; 
int   AL_NO;   
}RADAR;
如果我想用C#读这个结构体怎么读呢,想以结构体的形式读,谢谢!
------解决思路----------------------
直接用iostream读取到字节数组,然后按照偏移量循环读取
------解决思路----------------------
直接用filestream读取到字节数组,然后按照偏移量循环读取
------解决思路----------------------
只能自己针对没一个字段读写。这种代码是这样的
var x = new RADAR
{
    STDATA = new char[9] { 'a', 'b', '广', '州', '\0', '\0', '\0', '\0', '\0' },
    STIME = new char[7],
    AL_NO = 1234
};
var file = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "test.dat"));
if (file.Exists)
    file.Delete();
using (var f = file.OpenWrite())
using (var s = new BinaryWriter(f))
{
    s.Write(x.STDATA);
    s.Write(x.STIME);
    s.Write(x.MONI_FLAG);
    s.Write(x.AL_NO);
}
var y = new RADAR();
using (var f = file.OpenRead())
using (var s = new BinaryReader(f))
{
    y.STDATA = s.ReadChars(9);
    y.STIME = s.ReadChars(7);
    y.MONI_FLAG = s.ReadInt32();
    y.AL_NO = s.ReadInt32();
}

------解决思路----------------------
在实际的项目中,所谓“STDATA是9个字符,STIME 是7个字符”这太死板了。往往都需要变长的字符串,例如可以是10个字符,或者10k字符长度。可能因为你抄的c代码的原因,所以只想着固定字符长度。

在实际的从文件读写和传输设计当中,不同版本多一些字节,或者字符串、数组等等长度是可变,这都应该考虑到。考虑不到,那就是课堂练习而不是做产品呢。
------解决思路----------------------
在实际读取文件的产品设计当中,读取一个记录所返回的对象的类型往往也是可变的。比如说一个结构的开头说明了下边一共有多少记录,一共有多少字段,没一个字段的类型和长度(或者是可变长度用0表示),索引是什么,这是第几次修改设计版本,最多跟之前的哪一个版本的数据兼容(低于这个版本则不兼容)。然后是一条条的记录,而每一个记录里边要按照上面动态说明的字段规格来读取数据。

实际的使用当中,总是按照“表”的灵活形式来都写的。最终就过渡到10几年就炒得很热的标准——使用xml或者json格式为设计基础,而不是使用“结构体”。
  相关解决方案