0

我正在这样的文件中写入 time_t 变量(并且也以相同的方式读取它,但是,现在我使用读取而不是写入):

//写入时间

         file fd;
         time_t currentTime;
         currentTime = time(0); // current time
         fd.create(filepath);  
         fd.open(filepath);  
         fd.seek(SEEK_SET,0);  
         fd.write(&currentTime,sizeof(time_t));  
         fd.close();

// 读取时间

     file fd;
     time_t timeFromFile;
     fd.open(filepath);  
     fd.seek(SEEK_SET,0);  
     fd.read(&timeFromFile,sizeof(time_t));  

上述方法有问题吗?(除此之外,它正在我检查的情况下工作)。

附言。我正在为嵌入式设备写作,所以我不认为可移植性等应该是一个问题。我认为这将主要在类似类型的设备上运行。

4

2 回答 2

2

time_t不保证是 C++ 中的整数类型。

虽然没有定义,但它几乎总是一个整数值,保存自 1970 年 1 月 1 日 00:00 UTC 以来的秒数,对应于 POSIX 时间。

但是,如果您总是从同一个平台和编译器读取和写入,那应该没问题。值得注意的是,虽然大多数系统将时间表示为一个整体,但有些系统可能具有不同的大小。最初,time_t经常用 32 位数字表示。但是,这会产生2038 问题。如今,常见的time_t是用 64 位数字表示。

2038 年问题可能会导致某些计算机软件在 2038 年附近的某个时间点出现故障。该问题会影响所有将系统时间存储为有符号 32 位整数并将此数字解释为自 00 以来的秒数的软件和系统1970 年 1 月 1 日星期四 :00:00 UTC。

如果您正在为使用不同头文件(特别ctimetime_t. 如果您将 a 写入time_t可以从程序的另一个版本读取的文件,则数字的大小可能会因设备而异。

防止问题的最好方法是在编译时。如果您能够使用 C++11 编译器,则可以使用static_assert.

static_assert( sizeof(time_t) == 8, "Unexpected time_t size" );

如果您正在编译的目标使用不同的大小,您的代码将无法编译,并且将防止无法解释的错误。如果您认为这可能是一个问题,那么您应该以另一种方式自己序列化时间。

于 2013-05-30T15:10:43.393 回答
1

根据POSIX

time_tclock_t应为整数或实浮点类型。

因此,只要您不需要在不同的设备上读取它们,将它们写入这样的文件是完全合理的。

于 2013-05-30T15:11:15.083 回答