C++ 将时间变量写入文件

C++ 将时间变量写入文件,c++,C++,我在这样的文件中写入一个时间变量(并且以同样的方式读取它,但是,现在我使用read代替write): //写入时间 file fd; time_t currentTime; currentTime = time(0); // current time fd.create(filepath); fd.open(filepath); fd.seek(SEEK_SET,0);

我在这样的文件中写入一个时间变量(并且以同样的方式读取它,但是,现在我使用read代替write):

//写入时间

         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));  
上述方法是否有问题?(除此之外,它正在工作,因为我检查)

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

不能保证是C++中的一个积分类型。 尽管未定义,但它几乎始终是一个整数,表示自1970年1月1日UTC 00:00以来的秒数,对应于POSIX时间

但是,如果您总是从同一个平台和编译器进行读写,那就没问题了。值得注意的是,虽然大多数系统将时间表示为一个积分,但有些系统可能有不同的大小。最初,
time\u t
通常由32位数字表示。但是,这会产生错误。如今,常见的现象是用64位数字表示时间

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

如果您正在为使用不同头文件的不同设备进行编译(尤其是
ctime
),您应该知道
时间的大小可能不同。如果您将
时间\u t
写入一个可以从程序的另一个版本读取的文件,则不同设备之间的数字大小可能不同

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

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

不能保证是C++中的一个积分类型。 尽管未定义,但它几乎始终是一个整数,表示自1970年1月1日UTC 00:00以来的秒数,对应于POSIX时间

但是,如果您总是从同一个平台和编译器进行读写,那就没问题了。值得注意的是,虽然大多数系统将时间表示为一个积分,但有些系统可能有不同的大小。最初,
time\u t
通常由32位数字表示。但是,这会产生错误。如今,常见的现象是用64位数字表示时间

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

如果您正在为使用不同头文件的不同设备进行编译(尤其是
ctime
),您应该知道
时间的大小可能不同。如果您将
时间\u t
写入一个可以从程序的另一个版本读取的文件,则不同设备之间的数字大小可能不同

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

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

根据:

时间和时钟应为整数或实浮点类型

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

根据:

时间和时钟应为整数或实浮点类型


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

@Mats-peterson:谢谢。@Mats-peterson:谢谢。谢谢Barmar。出于兴趣:如果必须从其他设备读取,我该怎么办?+1、htonl/ntohl(或模板模拟)很容易使其成为平台不可知论者—有一个浮点模拟?可能将其转换为
struct tm
并编写(使用
ntohl
后)会更好,因为它的所有组件都是
int
。谢谢Barmar。出于兴趣:如果必须从其他设备读取,我该怎么办?+1、htonl/ntohl(或模板模拟)很容易使其成为平台不可知论者—有一个浮点模拟?可能将其转换为
struct tm
并编写(在使用
ntohl
之后)会更好,因为它的所有组件都是
int
。嗨,史蒂夫,如果我的程序碰巧在不同的设备上运行,我该怎么办?@pseudo-name\u 127我添加了一些关于static\u-assert的信息,这可能会有所帮助。嗨,史蒂夫,谢谢。我不认为我有C++ 11编译器,但我会检查我也会检查我的软件是否会在不同的设备上运行。最后,我不确定我是否仍然明白为什么存储时间的方式对于不同的设备是一个问题?谢谢。@笔名_127我已经更新了答案,我意识到我太含糊了。我的意思是,如果您针对特定设备的不同头文件进行编译,那么您应该知道可能的大小更改。如果在不同的设备上使用相同的二进制文件,
time\t
的大小将是相同的。嗨,史蒂夫,那么如果我的程序恰好在不同的设备上运行,我该怎么办?@pseudo-name\u 127我添加了一些关于static\u assert的信息,这可能会有所帮助。嗨,史蒂夫,谢谢。我不认为我有C++ 11编译器,但我会检查-我会
static_assert( sizeof(time_t) == 8, "Unexpected time_t size" );