读取二进制文件,给结构体赋值。

时间:2023-01-04 10:02:55
读取一个二进制文件,给结构体赋值。结构体中还嵌套一个时间结构体。主结构体主要是long类型。请大仙写个例子,参考!

5 个解决方案

#1


   struct stA
   {
      long a;
      long b;
      struct  stB
      {
         int Year;
         int Month;
         int Day;
         int Hour;
         int Min;
         int Sec;
      } stb;
   };

   struct stA st1;
   st1.a = 1;
   st1.b = 2;
   st1.stb.Year = 2011;
   st1.stb.Month = 7;
...

#2


楼上的答案lz满意吗?
如果不是lz想要的,那lz的意思是不是读一个文件一下子给一个结构体赋值?
如果是这样,那你个文件的内容的格式必须事先知道,或者是事先用同一个结构体的变量的内容写到文件中,结构体里套不套都没关系。
读写的时候用文件的二进制读写函数,取结构体变量的地址,指定读取结构大写的数据块。
借用ls的定义,给一个C语言读写二进制文件的函数:
 FILE *fp = fopen("xxx.dat",r);
 fread(fp,&stA,1,sizeof(stA)); 
 /* fwrite(fp,,&stA,1 , sizeof(stA)); 这是写一个结构体到二进制文件的语句 */
fclose(fp);

#3


struct S_Test
{
long a;
};

void CMainFrame::Test()
{
int MsgSize; //Msg结构体的大小为48字节
MsgSize=sizeof(stLayCounterMsg);
stLayCounterMsg Msg;
FILE *f = NULL;
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");
if (f == NULL)
{
return;
}
unsigned char a[4] = {0};
fread(a, 1, 4, f);

S_Test s;
int i = sizeof(S_Test);
memcpy(&s, a, i);
long b = htonl(s.a);

unsigned char temp[48]={0};

fread(temp,48,1,f);
memcpy(&Msg,temp,MsgSize);

long yy=Msg.receiver_mid;
Msg.stSysTime.ucDate;
long p=htonl(Msg.stSysTime.ucDate);
fclose(f);
}
谢谢。。1、2楼上。
读取二进制文件还是有点问题,时间的值好像不对。请再看看!!!

#4


你打开文件的方式有些问题,
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");

b是二进制 ,a+是读和追加写方式打开(文件不存在则创建新文件),文件打开后文件位置指针指向文件末尾,这时候写数据直接追加到文件末,可是读就读不到数据了。要想从头读数据,使用fseek(f,0L,SEEK_SET)函数移动指针到文件开头。如果不打算写文件,建议改成“rb”方式打开文件吧(这样文件不存在就返回NULL,后面的判断语句帮助你确认是否可以继续读文件)。

搞不清楚结果为啥不对,最好的办法是调试跟踪一下, 首先看看读入到变量的值是否正确 ,还是以后的结构体数据使用出现问题了。可以使用uedit之类的可以编辑二进制文件的编辑器打开文件,跟踪程序读到变量的值(用16进制格式查看)和文件中应读的值是否一致。如果没有读错,程序的结果不对,那要么是文件里的数据本身就是错误的,要么是后面的应用地方有问题了。
(还可以参考fread函数的返回值看是否读的时候有错没有。)

#5


结构变量地址对齐方式

#1


   struct stA
   {
      long a;
      long b;
      struct  stB
      {
         int Year;
         int Month;
         int Day;
         int Hour;
         int Min;
         int Sec;
      } stb;
   };

   struct stA st1;
   st1.a = 1;
   st1.b = 2;
   st1.stb.Year = 2011;
   st1.stb.Month = 7;
...

#2


楼上的答案lz满意吗?
如果不是lz想要的,那lz的意思是不是读一个文件一下子给一个结构体赋值?
如果是这样,那你个文件的内容的格式必须事先知道,或者是事先用同一个结构体的变量的内容写到文件中,结构体里套不套都没关系。
读写的时候用文件的二进制读写函数,取结构体变量的地址,指定读取结构大写的数据块。
借用ls的定义,给一个C语言读写二进制文件的函数:
 FILE *fp = fopen("xxx.dat",r);
 fread(fp,&stA,1,sizeof(stA)); 
 /* fwrite(fp,,&stA,1 , sizeof(stA)); 这是写一个结构体到二进制文件的语句 */
fclose(fp);

#3


struct S_Test
{
long a;
};

void CMainFrame::Test()
{
int MsgSize; //Msg结构体的大小为48字节
MsgSize=sizeof(stLayCounterMsg);
stLayCounterMsg Msg;
FILE *f = NULL;
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");
if (f == NULL)
{
return;
}
unsigned char a[4] = {0};
fread(a, 1, 4, f);

S_Test s;
int i = sizeof(S_Test);
memcpy(&s, a, i);
long b = htonl(s.a);

unsigned char temp[48]={0};

fread(temp,48,1,f);
memcpy(&Msg,temp,MsgSize);

long yy=Msg.receiver_mid;
Msg.stSysTime.ucDate;
long p=htonl(Msg.stSysTime.ucDate);
fclose(f);
}
谢谢。。1、2楼上。
读取二进制文件还是有点问题,时间的值好像不对。请再看看!!!

#4


你打开文件的方式有些问题,
f = fopen("D:\\OfficeStat_20110607_010203.log", "ab+");

b是二进制 ,a+是读和追加写方式打开(文件不存在则创建新文件),文件打开后文件位置指针指向文件末尾,这时候写数据直接追加到文件末,可是读就读不到数据了。要想从头读数据,使用fseek(f,0L,SEEK_SET)函数移动指针到文件开头。如果不打算写文件,建议改成“rb”方式打开文件吧(这样文件不存在就返回NULL,后面的判断语句帮助你确认是否可以继续读文件)。

搞不清楚结果为啥不对,最好的办法是调试跟踪一下, 首先看看读入到变量的值是否正确 ,还是以后的结构体数据使用出现问题了。可以使用uedit之类的可以编辑二进制文件的编辑器打开文件,跟踪程序读到变量的值(用16进制格式查看)和文件中应读的值是否一致。如果没有读错,程序的结果不对,那要么是文件里的数据本身就是错误的,要么是后面的应用地方有问题了。
(还可以参考fread函数的返回值看是否读的时候有错没有。)

#5


结构变量地址对齐方式