Как написать структуру с членами структуры, хранящими двоичные данные в файл, используя C

В следующих программах есть моя структура как

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 ответов

Другие вопросы по тегам