C#中怎么读取Struct(结构体)文件!!!!??救救我!!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中怎么读取Struct(结构体)文件!!!!??救救我!!!!相关的知识,希望对你有一定的参考价值。

做项目需要读取一个.DAT文件,这个文件是别人给的,里面记录了一些调试需要用到的参数,是用结构体(Struct)写成的,用的是C++写的。。。。。
现在我拿到了这个.dat文件的结构,里面大致形式为(嵌套的结构体):
struct A

...
struct B

....
struct C

.....



好像用C++读取很容易,但我目前的软件都是用C#写的,只能在C#里面读了,这个要怎么读啊?网上找了一些资料,看上去好复杂,哪位大虾能详细的讲一下啊,谢谢!!!!
还有,我曾经想过是否可以用C++写一个读取结构体的DLL,然后用C#来调用,这样要简单一下,可以这样做吗?C++的DLL大致应该怎么写啊,本人C++不是很擅长。。。。C#要怎么调用C++的DLL啊?谢谢!!

参考技术A 首先需要告诉我们,你的DAT文件是怎么存储这些结构啊!
不可能说你的DAT文件里面存储的就是struct A,struct B这种东西。
文件,都是按二进制去存储的信息,当然啦,假如你的信息是字符串编码的,那么这个文件是可以按照字符串去读取的。我不知道这么说你是否明白,举个例子,
假如你要存储一个字符"A",而这个"A"是用ASCII编码的,那么存储在文件里面的数据就是A的ASCII码:1000001,你可以二进制流的形式去读取这个字符,如下:
//先写一个测试文件
System.IO.FileStream fs = new System.IO.FileStream("test.dat", System.IO.FileMode.Create);
fs.WriteByte(65);
fs.Flush();
fs.Dispose();
//打开刚才写的文件
fs = new System.IO.FileStream("test.dat", System.IO.FileMode.Open);
byte data = (byte)fs.ReadByte();
char c = Convert.ToChar(data);//调试的时候可以发现,这个c就是一个A
fs.Dispose();

当然如果文件是存文本,可以用简单的方法去读取:
System.IO.StreamReader sr = new System.IO.StreamReader("test.dat");
string str = sr.ReadToEnd();//直接以字符串的形式去读取,也是可以得到A
sr.Dispose();

因此呢,读一个文件是很简单的事情,关键你要告诉我们,你的数据是怎么写进文件的追问

我也知道可以用文件流去读,但问题是你怎么知道变量A的偏移量是多少?我记得C++里面直接可以定义一个相同的结构体变量,然后读出来,之后就可以用 结构体.成员 来使用了啊,C#应该怎么做?

追答

我可以很负责地告诉你,绝对没有直接从一个文件里面出一个结构体出来的系统类库,有也是自己写的,自己做了转换的

你现在就告诉我们这个dat文件是怎么存放数据的吧
我举个简单的例子吧,告诉你,假如是我自己去写文件,读文件,我是怎么做的:
假如我要存这样的一个数据
public class Note

internal string title;
internal string content;


StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(note.title);//存title
sw.WriteLine(note.content);//存content

读取:
StreamReader sr = new StreamReader(fs);
note.title = sr.ReadLine();
note.content = sr.ReadLine();

如果存储了多个对象,只不过就是一个循环而已,逻辑和思路都非常的清晰

参考技术B 这个我做过,但是你要先在c#里面定义一个和c++里面一样的结构体,
我那个写进去是以2进制方式写的,读的时候也用2进制来读。
在c#里面用系统的api来读取就是了
这个函数
ReadFile
-----------------------------------------------------------------------
函数原型
BOOL ReadFile( HANDLE hFile, //文件的句柄
  LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
  DWORD nNumberOfBytesToRead, //要读入的字节数
  LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
  LPOVERLAPPED lpOverlapped //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。该结构定义了一次异步读取操作。否则,应将这个参数设为NULL   
);
--------------------------------------------------------------------------
[DllImport("Kernel32.dll")]
public static extern bool ReadFile(IntPtr Hfile,ref 你的结构体名 lpBuffer,int nNumberOfBytesToRead,ref int lpNumberOfBytesRead,IntPtr zero);
参考技术C 顺便学习下

c语言怎么用文件保存和读取 结构体数组/

txt

#include <stdio.h>
int main()

struct test
int a;
char s[10] ;
double d ;
tr[3] , tw[3] =
1,"hello1" , 100 ,
2,"hello2" , 90,
3,"hello3", 200
; //定义一个结构体数组

FILE *fp ;
fp=fopen("struct.dat" , "wb" );
if ( fp == NULL )
return -1 ;
fwrite( (char*)tw , sizeof(struct test), 3 , fp ); //将数组写入文件
fclose(fp);
//以上完成写操作
fp=fopen("struct.dat" , "rb" );
if ( fp == NULL )
return -1 ;
fread( (char*)tr , sizeof(struct test), 3 , fp ); //从文件中读三个结构体的数据,也可以一个一个的读
fclose(fp);
//输出读到的数据

int i;
for(i=0;i<3;i++ )
printf("%d %s %lf\n" , tr[i].a , tr[i].s, tr[i].d );


return 0;
参考技术A 结构体数据的保存通常以二进制形式进行.
FILE *fw = fopen(filename,"wb");
写函数是fwrite(&structdata,sizeof(structdata),1,fw);
FILE *fr = fopen(filename,"rb");
读函数是fread(*structdata,sizeof(structdata),1,fr);
每次读写都是一个完整的结构体数据。本回答被提问者采纳
参考技术B 文本方式读写
#include "stdio.h"
#include <stdlib.h>
#define SIZE 5
struct student
char ID[10];
char Name[12];
int Score;
stud[SIZE];

void read()

FILE *fp;
int i;

if((fp=fopen("score.txt","rt"))==NULL)

printf("cannot open file\n");
return;

for(i=0;i<SIZE;i++)
fscanf(fp,"%s %s %d\n",stud[i].ID,stud[i].Name,&stud[i].Score);
fclose(fp);


void save()

FILE *fp;
int i;
if((fp=fopen("score.txt","wt"))==NULL)

printf("cannot open file\n");
return;

for(i=0;i<SIZE;i++)
fprintf(fp,"%-10s%-12s%d\n",stud[i].ID,stud[i].Name,stud[i].Score);
fclose(fp);


void main()

read();
save();
追问

&stud[i].Score 为什么它要加个&

追答

因为是整数(以及浮点数)

参考技术C fread/fwrite,里面是读取/写入块,一个块多少字节,你可以把一个块想象成为一个结构,数量就是数组

以上是关于C#中怎么读取Struct(结构体)文件!!!!??救救我!!!!的主要内容,如果未能解决你的问题,请参考以下文章

matlab中怎么定义结构体

matlab中怎么定义结构体

c语言怎么用文件保存和读取 结构体数组/

结构体和双链表 struct myStruct int ID; int TYPE; char NAME[20]; ;

matlab怎样输出结构体数组

在matlab中怎么定义结构体?机构体的概念?