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啊?谢谢!!
不可能说你的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();
如果存储了多个对象,只不过就是一个循环而已,逻辑和思路都非常的清晰
我那个写进去是以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(结构体)文件!!!!??救救我!!!!的主要内容,如果未能解决你的问题,请参考以下文章