我在这样的文件中写一个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(¤tTime,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。我正在为嵌入式设备写作,所以我不认为可移植性等应该是一个问题。我认为这将主要在相似类型的设备上运行。
答案 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)