のファイルにタイムスタンプデータを読み込みと書き込み:C/C++:/usr/include/time.hからマルチアーキテクチャのサポート
/* Used by other time functions. */
struct tm
{
int tm_sec;. . . /* Seconds..[0-60] (1 leap second) */
int tm_min;. . . /* Minutes..[0-59] */
int tm_hour;. . . /* Hours.. [0-23] */
int tm_mday;. . . /* Day... [1-31] */
int tm_mon;. . . /* Month.. [0-11] */
int tm_year;. . . /* Year.- 1900. */
int tm_wday;. . . /* Day of week..[0-6] */
int tm_yday;. . . /* Days in year.[0-365].*/
int tm_isdst;.. . /* DST... [-1/0/1]*/
#ifdef. __USE_BSD
long int tm_gmtoff;. . /* Seconds east of UTC. */
__const char* tm_zone;./Timezone abbreviation. */
#else
long int __tm_gmtoff;.. /* Seconds east of UTC. */
__const char* __tm_zone;./Timezone abbreviation. */
#endif
};
あなたはファイルに、この構造を書きたい、あなたがしたい場合あなたのプログラムがそれを読み返してマルチアーチをサポートするようにしてください(つまり、32ビット版で64ビット版がそれを読み込みます)、システムごとに同じサイズであることを確認するためにいくつかのハックをしなければなりません。誰もアーキテクチャに依存しないタイムスタンプを保持するためのより良い方法を知っていますか?例えば、私は、time_tやstruct tmのような構造体をファイルに書き込んで、それをどのアーキテクチャでも読み込めるようにしたいと考えています。誰にもこれに関する経験やアドバイスはありますか? struct tmはC/C++でタイムスタンプを保存する最善の方法ですか?私は、この構造を使ってかなりのオーバーヘッドがあることを認識しています。
私は現在、以下に構造を再定義しています
//Force 32 bit format and space requirements
struct tm32
{
int tm_sec;. . . /* Seconds..[0-60] (1 leap second) */
int tm_min;. . . /* Minutes..[0-59] */
int tm_hour;. . . /* Hours.. [0-23] */
int tm_mday;. . . /* Day... [1-31] */
int tm_mon;. . . /* Month.. [0-11] */
int tm_year;. . . /* Year.- 1900. */
int tm_wday;. . . /* Day of week..[0-6] */
int tm_yday;. . . /* Days in year.[0-365].*/
int tm_isdst;.. . /* DST... [-1/0/1]*/
int tm_gmtoff; // this does nothing but hold space
int tm_zone; // this does nothing but hold space
};
私は構造体tmを操作するために使用している機能(はmktime()、時間()、のgmtime()、のstrftime())ので、 struct tm構造体の最後の2つのフィールドを見るようには見えないので、単純に整数をプレースホルダーとして使用して、サイズが常に同じになるようにします。しかし、私はまだ...これまでよりよい解決策を探しています
編集:私は上記の修正に使用されるint型はint32_tされたり、何でも固定幅のタイプを選択します。
+1の最初の段落は – tobyodavies
+1です。これは構造をシリアル化する一般的な方法です。 Nitpick:もしあなたがそれを詰めるつもりなら、それらのフィールドのほぼすべてのサイズは 'uint8_t'です。 'tm_year'はより多くの(または署名された型)を必要とし、' tm_gmtoff'はより大きく、署名する必要があります。 – derobert
これは、整数フィールドの格納の問題を解決しますが、char *およびlong intメンバ(32ビットから64ビットの範囲である可能性があります)の標準固定幅フィールドを作成する必要があります。 – jkrez