2010-11-06 40 views
6

Đối với một chương trình todo nhỏ mà tôi đang viết, tôi có timestamps rằng là của mẫu đơn nàyLàm cách nào để lưu trữ một dấu thời gian time_t vào một tệp bằng C?

time_t t = time(NULL); 

và được lưu mỗi khi một nhiệm vụ được nhập để biểu thị thời điểm đó nó đã được nhập.

Tôi muốn lưu trữ tác vụ vào một tệp văn bản thuần túy để trạng thái có thể được lưu và khôi phục. Làm cách nào để lưu dấu thời gian vào tệp văn bản và làm cách nào để đưa chúng trở lại trong chương trình của tôi sau khi đọc tệp văn bản?

Trả lời

12

Chuyển đổi time_t-struct tm sử dụng gmtime(), sau đó chuyển đổi struct tm để văn bản đơn giản (tốt nhất theo tiêu chuẩn ISO 8601) sử dụng strftime(). Kết quả sẽ là di động, có thể đọc được và có thể đọc được bằng máy.

Để quay lại số time_t, bạn chỉ cần phân tích cú pháp chuỗi trở lại thành struct tm và sử dụng mktime().

Để tham khảo:

mẫu Mã số:

// Converting from time_t to string 
time_t t = time(NULL); 
struct tm *ptm = gmtime(&t); 
char buf[256]; 
strftime(buf, sizeof buf, "%F %T", ptm); 
// buf is now "2015-05-15 22:55:13" 

// Converting from string to time_t 
char *buf = "2015-05-15 22:55:13"; 
struct tm tm; 
strptime(buf, "%F %T", &tm); 
time_t t = mktime(&tm); 
+0

một ví dụ sẽ rất đẹp .. – Daniel

+0

@simpleBob: Chỉ có ba cuộc gọi hàm và tất cả chúng đều được ghi nhận rõ ràng tại các liên kết được cung cấp. Bạn đã thử sử dụng chúng chưa? Bạn có gặp phải bất kỳ vấn đề cụ thể nào không? –

+0

Tôi đã tự hỏi làm thế nào để có được mã hóa nó trở lại time_t sau khi sử dụng 'strftime()'. Nhưng tôi đã tìm thấy 'strptime' rồi. Cảm ơn bạn! – Daniel

1

Nếu bạn không nhớ một chút giả định unportable, chỉ cần đúc time_t-long (long long nếu bạn có một trình biên dịch C99), viết giá trị long, đọc giá trị và đúc lại time_t.

Tiêu chuẩn không đảm bảo rằng một time_t thậm chí còn biểu diễn bằng dài: nó chỉ nói time_t là một loại số học, nhưng thủ đoạn trên nên làm việc cho tất cả các hệ lành mạnh :-)

3

Các di cách đang sử dụng chức năng difftime. Hãy tính time_t cho kỷ nguyên đã chọn bằng cách sử dụng mktime, sau đó sử dụng difftime để tính toán sự khác biệt tính bằng giây. Để chuyển đổi trở lại, bạn có thể bắt đầu với kỷ nguyên là struct tm và thêm số giây vào tm_sec, sau đó gọi mktime để nhận số time_t.

Các lành mạnh cách là giả định time_t được biểu diễn như giây kể từ khi kỷ nguyên Unix (1970/01/01 00:00 GMT) và chuyển đổi sang một kiểu số nguyên lớn (long long là tốt nhất) để in nó. POSIX yêu cầu time_t để là giây kể từ thời đại, và trên bất kỳ hệ thống lành mạnh nào.

+0

Tôi đã thực hiện các đề xuất đầu tiên của bạn, vì tôi cần phải đối phó với các xem xét chéo và nền tảng chéo. –

Các vấn đề liên quan