如何使用C将结构成员写入存储二进制数据的结构到文件中

时间:2018-04-17 22:14:22

标签: c time struct hex socketcan

在以下程序中,我的结构为

struct binary
{  
  char *time_str;
  uint16_t id;
  uint8_t data[8];  
};

long usec()
{
 struct timeval start;
 long mtime;
 gettimeofday(&start,NULL);
 mtime = start.tv_sec + start.tv_usec;
 return mtime;
}

void data_log(struct can_frame *frame_rd)
{
 int i;
 time_t t = time(NULL);
 struct tm *tm = localtime(&t);

 struct binary bin;
 sprintf(bin.time_str,"%#X.%#X.%#X %#X:%#X:%#X:%#lX",tm->tm_mday,tm- 
 >tm_mon+1,((tm->tm_year)%100),tm->tm_hour,tm->tm_min,tm->tm_sec,usec());

 puts(bin.time_str);

 bin.id = frame_rd->can_id;
 for(i=0;i<8;i++)
 {
  bin.data[i] = frame_rd->data[i];
 }
 fwrite(&bin,sizeof(bin),1,fPtr);
}

int main()
{
 struct can_frame frame_rd;
 while(1)
{
 open_file();
 data_log(&frame_rd);
 close_file();
}
 return 0;
}

如果fwrite函数中的结构被其他数据替换,但是对于上述带有time_str(十六进制格式)的结构,在wb模式下写入文件时,一切正常,程序崩溃。我确定问题接近time_stri和fwrite。因为我尝试了其他方法,如果程序如下,这个程序可以正常工作:

struct binary
{  
  uint8_t time_yr;
  uint8_t time_mon;
  uint8_t time_day;
  uint8_t time_hr;
  uint8_t time_min;
  uint8_t time_sec;
  uint32_t time_usec;
  uint16_t id;
  uint8_t data[8];  
};

long usec()
{
 struct timeval start;
 long mtime;
 gettimeofday(&start,NULL);
 mtime = start.tv_sec + start.tv_usec;
 return mtime;
}

void data_log(struct can_frame *frame_rd)
{
 int i;
 time_t t = time(NULL);
 struct tm *tm = localtime(&t);

 struct binary bin;
 bin.time_day = tm->tm_mday;
 bin.time_mon = tm->tm_mon+1;
 bin.time_yr  = ((tm->tm_year)%100);
 bin.time_hr  = tm->tm_hour;
 bin.time_min = tm->tm_min;
 bin.time_sec = tm->tm_sec;
 bin.time_usec= usec();

 bin.id = frame_rd->can_id;
 for(i=0;i<8;i++)
 {
  bin.data[i] = frame_rd->data[i];
 }
 fwrite(&bin,sizeof(bin),1,fPtr);
}

int main()
{
 struct can_frame frame_rd;
 while(1)
{
 open_file();
 data_log(&frame_rd);
 close_file();
}
 return 0;
}

第二个程序运行良好,没有任何崩溃,并将数据写入十六进制格式的文件中。但是在第二个程序中,时间不是以十六进制格式写入,而是以十六进制格式写入时间,第一个程序是正确的,当我使用puts查看时间的十六进制值时,它以十六进制显示时间格式,但程序在将数据写入文件时执行时崩溃。 如何解决这个问题,如何使用结构bin以十六进制格式将时间写入二进制文件。

在这两个程序中,open_file()和close_file()是以二进制模式打开文件和关闭文件的两个函数,这些函数不包含在本文的程序中,因为我们大多数人都知道打开文件并关闭文件。如果有人帮忙的话会很棒。提前谢谢。

0 个答案:

没有答案