[英]Write a time_t variable to file
我正在這樣的文件中寫入一個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(¤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。 我正在為嵌入式設備編寫程序,因此我不認為可移植性等問題。 我認為這將主要在類似類型的設備上運行。
在C ++中,不能保證time_t
是整數類型。
盡管未定義,但幾乎始終是一個整數值,該整數值保持自UTC 1970年1月1日00:00以來的秒數,對應於POSIX時間。
但是,如果您始終在同一平台和編譯器上進行讀寫,那應該沒問題。 值得注意的是,盡管大多數系統將時間表示為一個整體,但有些系統可能具有不同的大小。 最初, time_t
通常由32位數字表示。 但是,這會產生2038問題 。 time_t
,通常會看到time_t
用64位數字表示。
2038年問題可能會導致某些計算機軟件在2038年附近的某個時刻發生故障。該問題影響所有將系統時間存儲為帶符號的32位整數,並將此數字解釋為自00以來的秒數的所有軟件和系統。 1970年1月1日(星期四)00:00 UTC。
如果要針對使用不同頭文件(尤其是ctime
)的不同設備進行編譯,則應注意time_t
大小可能有所不同。 如果將time_t
寫入可以從程序的另一個內部版本讀取的文件,則設備之間的數字大小可能會有所不同。
預防問題的最佳方法是在編譯時。 如果您能夠使用C ++ 11編譯器,則可以使用static_assert
。
static_assert( sizeof(time_t) == 8, "Unexpected time_t size" );
如果您要針對的目標使用不同的大小,則您的代碼將無法編譯,並且可以防止無法解釋的錯誤。 如果您認為這是一個可能的問題,則應該以其他方式序列化時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.