2010-11-06 10 views
6

Para un pequeño programa de tareas que estoy escribiendo, que tienen marcas de tiempo que son de esta forma¿Cómo debo almacenar una marca de tiempo time_t en un archivo usando C?

time_t t = time(NULL); 

y se guardan cada vez que se introduce una tarea para indicar el tiempo que se ha escrito.

Quiero almacenar las tareas en un archivo de texto plano, para que el estado se pueda guardar y restaurar. ¿Cómo debo almacenar las marcas de tiempo en el archivo de texto y cómo debo recuperarlas en mi programa después de leer el archivo de texto?

Respuesta

12

convertir el time_t-struct tm usando gmtime(), a continuación, convertir el struct tm a texto sin formato (preferiblemente ISO formato 8601) utilizando strftime(). El resultado será portátil, legible para las personas y legible por máquina.

Para volver al time_t, simplemente analiza la cadena de nuevo en un struct tm y usa mktime().

Como referencia:

Ejemplo de código:

// 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 ejemplo sería muy bueno .. – Daniel

+0

@simpleBob: solo hay tres llamadas a funciones y están todas bien documentadas en los enlaces provistos. ¿Has intentado usarlos? ¿Te encontraste con algún problema específico? –

+0

Me preguntaba cómo volver a codificarlo a time_t después de usar 'strftime()'. Pero ya encontré 'strptime'. ¡Gracias! – Daniel

1

Si no te importa un poco de supuestos no portables, simplemente echar a time_tlong (long long si tiene un compilador C99), escribir el valor long, leer el valor y volver a emitir time_t.

El estándar no ofrece ninguna garantía de que un time_t es aún representable como mucho: sólo dice time_t es un tipo aritmético, pero el truco anterior debería funcionar para todos los sistemas de cuerdas :-)

3

El portátil camino está utilizando la función difftime. Calcule el time_t para una época elegida usando mktime, luego use difftime para calcular la diferencia en segundos. Para convertir de nuevo, puede comenzar con la época como struct tm y agregar la cantidad de segundos a tm_sec, luego llamar al mktime para obtener un time_t.

El cuerdo manera es asumir time_t se representa como segundos desde la época Unix (1970-01-01 00:00 GMT) y convertir a un gran tipo entero (long long es el mejor) para imprimirlo. POSIX requiere time_t para ser segundos desde la época, y en cualquier sistema sano que será.

+0

Hice la primera de sus sugerencias, ya que tengo que lidiar con el compilador cruzado y las consideraciones de plataforma cruzada. –

Cuestiones relacionadas