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

做项目需要读取一个.DAT文件,这个文件是别人给的,里面记录了一些调试需要用到的参数,是用结构体(Struct)写成的,用的是C++写的。。。。。
现在我拿到了这个.dat文件的结构,里面大致形式为(嵌套的结构体):
struct A
{
...
struct B
{
....
struct C
{
.....
}
}
}
好像用C++读取很容易,但我目前的软件都是用C#写的,只能在C#里面读了,这个要怎么读啊?网上找了一些资料,看上去好复杂,哪位大虾能详细的讲一下啊,谢谢!!!!
还有,我曾经想过是否可以用C++写一个读取结构体的DLL,然后用C#来调用,这样要简单一下,可以这样做吗?C++的DLL大致应该怎么写啊,本人C++不是很擅长。。。。C#要怎么调用C++的DLL啊?谢谢!!
最新回答
一朵有毒の花

2025-03-02 09:02:55

首先需要告诉我们,你的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();

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

2025-03-02 08:15:02

这个我做过,但是你要先在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);
赱,結婚祛√

2025-03-02 04:20:21

顺便学习下