在以下程序中,我的结构为
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() 都是以二进制模式打开文件和关闭文件的两个函数,因为我们大多数人都知道打开文件和关闭文件,所以这些不包含在本文下的程序中。如果有人在这方面提供帮助,那就太好了。提前致谢。