将time_t变量写入文件

时间:2013-05-30 15:06:39

标签: c++

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

//写时间

         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));  

上述方法有问题吗? (除此之外它正在检查时工作)。

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

2 个答案:

答案 0 :(得分:2)

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

  

虽然未定义,但这几乎总是一个整数值,保持自UTC时间1970年1月1日00:00起的秒数,对应于POSIX时间。

但是,如果您总是从同一平台和编译器进行读写,那应该没问题。值得注意的是,虽然大多数系统将时间表示为一个整体,但有些可能具有不同的大小。最初,time_t经常由32位数字表示。但是,这会创建2038 problem。现在,通常会看到time_t以64位数字表示。

  

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

如果您正在为使用不同标头文件(特别是ctime)的不同设备进行编译,则应注意time_t的大小可能不同。如果您将time_t写入可以从程序的另一个版本中读取的文件,则设备之间的数字大小可能会有所不同。

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

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

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

答案 1 :(得分:1)

根据POSIX

  

time_t clock_t 应为整数或实数浮动类型。

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