首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 请教C#中读取这种文件格式方法 [已结贴,结贴人:xiaoyue520]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-22 17:35:54 楼主
    客户给的文件格式

    struct  SECTION
    {
    char Type; 
    double S3[3]; 
    }section;

    说明
    Type分类
    #define S_mileage          19
    S3[0] 起始里程
    S3[1] 结束里程
    S3[2] 这个断面的S偏差
    #define S_START          20
    S3[0] 起始S
    S3[1] 起始H
    S3[2] 这个断面的H偏差
    #define S_LINE          21
    S3[0] 直线结束点的S
    S3[1] 直线结束点的H
    #define S_ARC1            22
    S3[0] 圆心的S
    S3[1] 圆心的H
    S3[2] 弧的转角


    请各位大虾帮忙给个方案啊,最好写个小例子,本人初学CS
    80  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tiflon
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-22 17:39:501楼 得分:2
            Dim file1 As FileStream = New FileStream(Z_Path & "DAY.dat", FileMode.Open)
            Dim myread As BinaryReader = New BinaryReader(file1)
            myread.BaseStream.Seek(65536, SeekOrigin.Begin)

                myread.BaseStream.Seek(27, SeekOrigin.Current)
                NT.总天数 = myread.ReadInt32
                myread.BaseStream.Seek(4, SeekOrigin.Current)


            myread.Close()
            file1.Close()
            file1.Dispose()

    用BinaryReader ,类似于上面这种代码,不好意思我是用vb.net的,你网上去找c#的BinaryReader代码,很多的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-22 22:25:482楼 得分:0
    顶一下

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-22 22:51:083楼 得分:0
    怎么回答的人这么少啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • LQknife
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-22 23:37:314楼 得分:1
    帮顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wudi626
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 00:11:065楼 得分:1
    引用 4 楼 LQknife 的回复:
    帮顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wdgphc
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 09:29:336楼 得分:1
    没看明白,你再写个实例.或读了保存为什么?一个string串?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 09:56:317楼 得分:0
    引用 6 楼 wdgphc 的回复:
    没看明白,你再写个实例.或读了保存为什么?一个string串?


    最终的格式应当是

    起始里程 结束里程 这个断面的S偏差

      12      22      33

    起始S  起始H  这个断面的H偏差
      1      2        3

    大概就是这样的格式,问题是怎么去读?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • csharp_start
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 15:41:588楼 得分:1
    感觉没有好的方法,直接用文件流来一行一行读,如果要做得好些,可以写个操作类,实现得到某个节点(我理解:一个#define就是一个节点)下某个值(从你的文件看是3个,S[0]~S[2])等的操作.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • letian_fly
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 16:36:449楼 得分:1
    了解一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zswang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      7

    发表于:2008-08-23 19:46:3610楼 得分:20
    现将文件里的数据读到和结构一样大小的缓存(buffer)中;
    获取这段缓存的内存首地址UnsafeAddrOfPinnedArrayElement;
    将结构对象的地址指向该地址即可。

    参考如下代码:
    C# code
    //using System.Media; //using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct SECTION { public byte Type; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)] public double[] S3; } private void button1_Click(object sender, EventArgs e) { FileStream fileStream = new FileStream(@"c:\temp\temp.dat", FileMode.Open, FileAccess.Read); byte[] buffer = new byte[Marshal.SizeOf(typeof(SECTION))]; fileStream.Read(buffer, 0, buffer.Length); SECTION section = (SECTION)Marshal.PtrToStructure( Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0), typeof(SECTION)); fileStream.Close(); fileStream.Dispose(); Console.WriteLine("Type={0}, S3[0]={1}, S3[1]={2}, S3[2]={3}", section.Type, section.S3[0], section.S3[1], section.S3[2]); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zswang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      7

    发表于:2008-08-23 20:02:5311楼 得分:10
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
    这个大小是测试用的,实际是元素个数,这里是3.
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 21:45:3412楼 得分:0
    引用 11 楼 zswang 的回复:
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
    这个大小是测试用的,实际是元素个数,这里是3.
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]



    还是不行啊,数组取出来的数据是有问题的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 21:53:5813楼 得分:0
    得出来的数据成这样了
    Type=19, S3[0]=4.10568551694076E-321, S3[1]=0, S3[2]=-2.10648588040163E-37

    以上除了type的值是对了其它的都是有问题的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zswang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      7

    发表于:2008-08-23 22:04:5014楼 得分:20
    我测试的数据:00000000h: 0D AE 47 E1 7A 14 AE 28 40 A4 70 3D 0A D7 63 4C ; .瓽醶.?@=.譪L
    00000010h: 40 48 E1 7A 14 AE 87 56 40                      ; @H醶.畤V@


    图你的测试数据是啥样的?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 22:14:5715楼 得分:0
    http://www.brsbox.com/filebox/down/fc/4c6031fe8e287fec08bb782599c8afdf

    我传了其中的一个文件到网盘中,
    格式是这样的
    typedef struct{
    char Type; 
    double D5[5]; 
    }Halign;
    说明
    Halign[0].Type
    ==1  代表start
    #define START          1
    Halign[0].D5[0]
    起始里程
    Halign[0].D5[1]
    起始N
    Halign[0].D5[2]
    起始E
    Halign[0].D5[3]
    起始方位角
    Halign[1]以及以后的结构体根据Type判断类型
    类型分类如下
    #define LINE            2
    D5[0]直线长度
    #define ARC            3
    D5[0]圆弧半径
    D5[1]圆弧弧长
    #define SPIRAL          4
    D5[0]缓和曲线参数
    D5[1]缓和曲线起始半径
    D5[2]缓和曲线结束半径


    请帮我看看应当怎么做,谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 22:20:5116楼 得分:0
    1 31 0 64 0 0 0 0 0 0 89 64 0 0 0 0 0 64 -113 64 0 0 0 0 0 64 -113 64 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 -64 98 64 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 52 0 64 1 0 0 0 3 0 0 0 0 0 0 0
    0 -64 -126 64 59 112 -50 -120 -46 115 -115 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 4 0 0 0 0 0 0 0 0 0 121 64 0 0 0 0 0 -64 -126 64 0 0 0 0 0 0 -119 64
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 31 0 64 0 0 0 0 0 -32 -123 64 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 52 0 64 4 0 0 0

    我把这个文件转换一下是这样的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sunshine_anycall
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 22:34:5417楼 得分:2
    你客户给你的是一个c++文件,
    你问他再c++里是怎么用这个结构体的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zswang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      7

    发表于:2008-08-23 23:03:0318楼 得分:10
    这个文件打开分析了下,有五段数据,每段44字节:
    详情01 1F 00 40 00 00 00 00 00 00 59 40 00 00 00 00 00 40 8F 40 00 00 00 00 00 40 8F 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    02 00 00 00 00 00 00 00 00 C0 62 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 34 00 40 01 00 00 00
    03 00 00 00 00 00 00 00 00 C0 82 40 3B 70 CE 88 D2 73 8D 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    04 00 00 00 00 00 00 00 00 00 79 40 00 00 00 00 00 C0 82 40 00 00 00 00 00 00 89 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    02 1F 00 40 00 00 00 00 00 E0 85 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 34 00 40 04 00 00 00


    1(char)+5*8(double)=41
    看来多3个字节,第一char对齐估计是4.

    C# code
    [StructLayout(LayoutKind.Sequential, Pack = 4)] public class SECTION { public byte Type; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public double[] D5 = new double[5]; } private void button2_Click(object sender, EventArgs e) { FileStream fileStream = new FileStream(@"c:\temp\123.HAL", FileMode.Open, FileAccess.Read); byte[] buffer = new byte[Marshal.SizeOf(typeof(SECTION))]; while (fileStream.Read(buffer, 0, buffer.Length) >= buffer.Length) { SECTION section = new SECTION(); Marshal.PtrToStructure( Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0), section); Console.WriteLine( "Type={0}, D5[0]={1}, D5[1]={2}, D5[2]={3}, D5[3]={4}, D5[4]={5}", section.Type, section.D5[0], section.D5[1], section.D5[2], section.D5[3], section.D5[4]); } fileStream.Close(); fileStream.Dispose(); }


    输出Type=1, D5[0]=100, D5[1]=1000, D5[2]=1000, D5[3]=0, D5[4]=0
    Type=2, D5[0]=150, D5[1]=0, D5[2]=0, D5[3]=0, D5[4]=2.65250132361352E-314
    Type=3, D5[0]=600, D5[1]=942.4778, D5[2]=0, D5[3]=0, D5[4]=0
    Type=4, D5[0]=400, D5[1]=600, D5[2]=800, D5[3]=0, D5[4]=0
    Type=2, D5[0]=700, D5[1]=0, D5[2]=0, D5[3]=0, D5[4]=9.01848869650934E-314
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • falconfei
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 00:52:4119楼 得分:1
    帮你顶,没有看明白。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 09:12:2220楼 得分:0
    引用 18 楼 zswang 的回复:
    这个文件打开分析了下,有五段数据,每段44字节:
    详情01 1F 00 40 00 00 00 00 00 00 59 40 00 00 00 00 00 40 8F 40 00 00 00 00 00 40 8F 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    02 00 00 00 00 00 00 00 00 C0 62 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 34 00 40 01 00 00 00
    03 00 00 00 00 00 00 00 00 C0 82 40 3B 70 CE 88 D2 73 8D 40 00 00 00 00 00 00…



    谢谢楼上的辛苦回答,这段数据我也打开过,但是不知道怎么去分析,请问您是根椐什么来分析的

    还有下面输出的数据可能还是有点问题,因为他是测量仪器测出来的(坐标)数据,理论上来说应该不可能出现2.65250132361352E-314 类示这样的数据啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 09:40:1221楼 得分:0
    哦,我明白了,是一个double占8个字节以此来推算的吧


    贴子加分20谢谢大家的回答,顺便再问一下


    我要是修改了其中的数据比如:D5[0]=100 修改成 D5[0]=200 想要保存进去应该怎么做

    fileStream.Write能行吗,怎么样才能写到那个位置
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 09:41:3322楼 得分:0
    晕不能加分20,一定要100啊,分不够了,有分再加吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zswang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

      7

    发表于:2008-08-24 11:25:3223楼 得分:10
    写入参考如下代码:
    C# code
    [StructLayout(LayoutKind.Sequential, Pack = 4)] public class SECTION { public byte Type; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public double[] D5 = new double[5]; } private void button1_Click(object sender, EventArgs e) { FileStream fileStream = new FileStream(@"c:\temp\temp.dat", FileMode.Create, FileAccess.Write); byte[] buffer = new byte[Marshal.SizeOf(typeof(SECTION))]; SECTION section = new SECTION(); section.Type = 13; section.D5[0] = 12.34; section.D5[1] = 56.78; section.D5[2] = 90.12; section.D5[3] = 34.56; section.D5[4] = 78.90; Marshal.StructureToPtr(section, Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0), false); fileStream.Write(buffer, 0, buffer.Length); // ...写入多条数据,就重复上面的执行。 fileStream.Close(); fileStream.Dispose(); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoyue520
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-24 11:50:1724楼 得分:0
    谢谢.结帐啦
    修改 删除 举报 引用 回复