次のプログラムでは、次のような私の構造があります
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 (16 進形式) を持つ上記の構造体の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;
}
2 番目のプログラムは、クラッシュすることなく正常に動作し、データを 16 進形式でファイルに書き込みます。しかし、2番目のプログラムでは時間が16進形式で書き込まれておらず、16進形式で時間を書き込むために、最初のプログラムは正しくputs
、時間の16進値を確認するために使用すると、16進形式で時間が表示されますが、プログラムがクラッシュしますデータをファイルに書き込んでいるときに実行したとき。これを解決するにはどうすればよいですか、構造 bin を使用してバイナリ ファイルに時間を 16 進形式で書き込むにはどうすればよいですか。
どちらのプログラムでも、open_file() と close_file() は、バイナリ モードでファイルを開き、ファイルを閉じるための 2 つの関数であり、ほとんどの人がファイルを開いてファイルを閉じることを知っているため、これらはこの投稿のプログラム内には含まれていません。誰かがこれを手伝ってくれたら最高です。前もって感謝します。