提问者:小点点

将time_t变量写入文件


我正在这样的文件中编写一个time_t变量(但是也以同样的方式读取它,而不是write,现在我使用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));  

上述方法有什么问题吗?(此外,它正在工作,正如我所检查的)。

附注:我写的是一个嵌入式设备,所以我不认为可移植性等应该是一个问题。我认为这将运行大部分类似类型的设备。


共2个答案

匿名用户

在C++中不保证是整型。

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

但是,如果你总是从同一个平台和编译器读写,那应该没问题。值得注意的是,虽然大多数系统将时间表示为一个整数,但有些系统可能有不同的大小。最初,通常由32位数字表示。然而,这就产生了2038年的问题。现在,经常看到用64位数字表示。

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

如果您正在为使用不同头文件(特别是的大小可能不同。如果将写入一个可以从程序的另一个构建中读取的文件,则数字的大小可能在设备之间不同。

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

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

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

匿名用户

根据POSIX:

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

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

相关问题