2010-11-06 18 views
6

Per un piccolo programma todo che sto scrivendo, ho timestamp che sono di questa formaCome dovrei memorizzare un timestamp time_t in un file usando C?

time_t t = time(NULL); 

e vengono salvate ogni volta che un compito viene inserito per indicare il momento in cui è stata inserita.

Desidero memorizzare le attività in un file di testo normale, in modo che lo stato possa essere salvato e ripristinato. Come dovrei memorizzare i timestamp nel file di testo e come dovrei recuperarli nel mio programma dopo aver letto il file di testo?

risposta

12

Convertire il time_t-struct tm utilizzando gmtime(), quindi convertire il struct tm al testo (preferibilmente formato ISO 8601) con strftime(). Il risultato sarà portatile, leggibile dall'uomo e leggibile a macchina.

Per tornare allo time_t, è sufficiente analizzare la stringa in un struct tm e utilizzare mktime().

Per riferimento:

Esempio di codice:

// 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

un esempio sarebbe molto bello .. – Daniel

+0

@simpleBob: ci sono solo tre chiamate di funzione e sono tutte ben documentate nei collegamenti forniti. Hai provato a usarli? Hai incontrato problemi specifici? –

+0

Mi stavo chiedendo come riprenderlo a time_t dopo aver usato 'strftime()'. Ma ho già trovato "strptime". Grazie! – Daniel

1

Se non ti dispiace un po 'di ipotesi portabili, appena lanciato time_t-long (long long se si dispone di un compilatore C99), scrivere il valore long, leggere il valore e gettato di nuovo a time_t.

Lo Standard non fa alcuna garanzia che un time_t è nemmeno rappresentabile come un lungo: si dice solo time_t è un tipo aritmetico, ma il trucco di cui sopra dovrebbe funzionare per tutti i sistemi sani :-)

3

Il portatile modo sta utilizzando la funzione difftime. Calcola lo time_t per un'epoca scelta utilizzando mktime, quindi utilizza difftime per calcolare la differenza in secondi. Per riconvertire, è possibile iniziare con l'epoca come struct tm e aggiungere il numero di secondi a tm_sec, quindi chiamare mktime per ottenere uno time_t.

Il sano modo dire assumere time_t è rappresentato come secondi da epoch Unix (1970-01-01 00:00 GMT) e convertire in larga tipo intero (long long è migliore) stamparlo. POSIX richiede time_t di essere secondi dall'epoca, e su qualsiasi sistema sensato lo sarà.

+0

Ho fatto il primo dei vostri suggerimenti, in quanto ho bisogno di far fronte al cross compilatore e alle considerazioni su più piattaforme. –

Problemi correlati