Foros del Web » Programación para mayores de 30 ;) » Programación General »

Dudas con libreria time.h

Estas en el tema de Dudas con libreria time.h en el foro de Programación General en Foros del Web. Hola.. estoy haciendo un programa en c++ en el cual tengo que guardar una hora en un fichero y despues leer dicha hora, y calcular ...
  #1 (permalink)  
Antiguo 11/05/2005, 03:47
Avatar de Azrael666  
Fecha de Ingreso: noviembre-2004
Mensajes: 652
Antigüedad: 20 años
Puntos: 1
Dudas con libreria time.h

Hola.. estoy haciendo un programa en c++ en el cual tengo que guardar una hora en un fichero y despues leer dicha hora, y calcular el tiempo pasado entre que se guardó esa hora en el fichero y la hora a la que se volvió a abir. El formato que uso es time_t.

El problema es que sin guardar a fichero funciona todo bien.. quiero decir: obtengo la hora en un momento dado.. y minutos despues (sin haber cerrado el programa) obtengo la siguiente hora y calculo la diferencia en segundos entre esas dos horas; pero cuando lo tengo que guardar al fichero (trabajo con la libreria fstream.h) y volver a leerlo me da errores (solo cuando lo leo) porque guardo un time_t pero al leerlo no se como hacerlo.

Era para ver si me sabiais decir como lo podría hacer y de paso como puedo darle formato a ese time_t para mostrarlo por pantalla.

Un saludo
  #2 (permalink)  
Antiguo 11/05/2005, 04:34
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
time_t es un long (4 bytes), deberias leerlo con sizeof(time_t) sin ningun tipo de problemas.

Y asi podes mostrarlo en pantalla:
Código:
struct tm *outtime;
outtime = localtime(&old_time); << old_time es un time_t leido de un archivo
printf("%.19s\n", asctime(outtime));
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 11/05/2005, 12:28
Avatar de Azrael666  
Fecha de Ingreso: noviembre-2004
Mensajes: 652
Antigüedad: 20 años
Puntos: 1
como?.... sería algo asi?:

#include <fstream>
#include<time.h>

using std::ifstream;

ifstream fEnt;
time_t hora;
fEnt.clear();
fEnt.open("fichero.txt");
fEnt >> sizeof(hora);
//....

es que no estoy acostumbrado a trabajar con time_t ... nose si será asi... si no lo es podrías ponerme un ejemplillo?
gracias
  #4 (permalink)  
Antiguo 11/05/2005, 12:42
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
No, si usas streams de C++ no tenes que hacer mas que empujarlos, seria algo asi si ya escribiste en el archivo fichero.txt la hora:

Código:
#include <fstream>
#include <time.h>

using std::ifstream;
using std::ofstream;

void main()
{
  time_t hora;
  ifstream fEnt;
  fEnt.clear();
  fEnt.open("fichero.txt");
  fEnt >> hora;
  struct tm *outtime;
  outtime = localtime(&hora);
  printf("%.19s\n", asctime(outtime));
}
El output es de este tipo: Wed May 11 20:47:11
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 16/05/2005, 08:27
Avatar de Azrael666  
Fecha de Ingreso: noviembre-2004
Mensajes: 652
Antigüedad: 20 años
Puntos: 1
bueno.. mi ultimo mensaje fue un ida de olla total.. me di cuenta luego.. al final con lo que me dijiste de que era un long lo arreglé asi:

time_t t;
long dato;
fEnt >> dato;
t = static_cast<time_t>(dato);
return t;

y me tira.. gracias

y ahora otra duda...

tengo declardados varios time_t ... pero en uno al hacer esto:
time_t hora=time(NULL);
me da un error... mientras que en otros no me lo da haciendo lo mismo... el problema me dice que es cosa del NULL pero si no me da errores en los otros tampoco me lo tendria que dar en ese... es muy raro...
  #6 (permalink)  
Antiguo 16/05/2005, 09:01
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Si miras mi ejemplo de arriba vas a ver que no hace falta el casting ya que se pueden empujar los time_t sin problema, en realidad son un typedef.

En cuanto a time_t hora=time(NULL); ¿Que tipo de error da? ¿Al compilar o en ejecucion? ¿Y exactamente que es lo que queres hacer con eso?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 17/05/2005, 09:11
Avatar de Azrael666  
Fecha de Ingreso: noviembre-2004
Mensajes: 652
Antigüedad: 20 años
Puntos: 1
El error que me da es: (en compilación claro)

registradora.cpp: In member function `int Registradora::getprecio(long int)':
registradora.cpp:5: `NULL' undeclared (first use this function)registradora.cpp:5: (Each undeclared identifier is reported only once for each function it appears in.)

y la función es: (está en el .cpp, pero el #include <time.h> lo tengo en el .hpp)

int Registradora::getprecio(time_t t)
{
time_t t2=time(NULL); //el fallo lo da aqui
int seg = static_cast<int>(difftime(t2,t));
int min = seg/60;
int precio = min*centmin;
return precio;
}



y tendría que funcionar bien.. porque en el cpp principal tengo: time_t h=time(NULL); y funciona perfectamente.

PD: haciendo lo mismo en un fichero aparte, sin hacer un proyecto (uso el Dev-C++) funciona perfectamente... pero al introducir el .hpp y el .cpp con la clase "registradora" me da ese fallo.

PD2: lo que me preguntabas sobre lo que quiero hacer: el proyecto completo es un gestor de un parking con las tipicas opciones de insertar vehiculo, sacarlo, visualizar todos los vehiculos, guardar a un fichero de texto todos los datos, cargar los datos guardados y alguna otra cosa mas; al guardar los datos a fichero se guarda tambien la hora de entrada como un time_t, y al cargar los datos se lee ese time_t de la forma que puse anteriormente y que me comentas que puedo dejar sin el static_cast<>.
Vale.. todo eso funciona bien.. pero cuando saco un vehiculo, al eliminarlo de la lista correspondiente llamo a esa funcion getprecio() a la que le paso la hora de entrada del vehiculo y dentro de la función obtengo la hora actual (la de salida) y calculo el precio... pues es justamente ahi donde me falla.

A bueno.. en un principio lo habia hecho sin un proyecto (todo con hpps porque no tenia suficientes funciones y clases para ir separandolo en cpps y porque asi me resultaba mas facil ver donde tenia los errores y no me liaba buscando por 20 archivos diferentes... y haciendolo de esa forma funcionaba perfectamente.. fue al pasarlo al proyecto cuando me salió el fallo.


Creo que eso es todo.. a ver si se te ocurre que podrá ser lo que pasa. Gracias ;)
  #8 (permalink)  
Antiguo 17/05/2005, 09:48
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Eso de "en compilación, claro" no era tan claro, lo normal es pensar que era en ejecución (se supone que dominas la sintaxis).

Te está diciendo que NULL no está declarado... Y eso sí es extraño. No puedo adivinar qué te ocurre (los errores raros como ese pueden estar debidos a diversas cosas), pero revisa que estés incluyendo la <time.h> en el archivo CPP (que lo incluyes incluyendo a su vez el "Registradora.hpp", o deberías).

Sobre la función, la veo muy extraña. ¿Por qué no la reduces?

Código:
inline int Registradora::getprecio(time_t t)
{
	return difftime(time(NULL),t)/60*centmin;
}
En cualquier caso no deberías usar las librerías de C directamente, sino las conversiones para C++. Tu <time.h> en C++ es <ctime>, y ""puede"" que venga de ahí el error al usarlo con clases. De un modo u otro es recomendable usar las de C++ traidas de C y no las de C antiguas.
  #9 (permalink)  
Antiguo 17/05/2005, 11:02
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
¿registradora.cpp incluye a registradora.h, verdad?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #10 (permalink)  
Antiguo 17/05/2005, 13:34
Avatar de Azrael666  
Fecha de Ingreso: noviembre-2004
Mensajes: 652
Antigüedad: 20 años
Puntos: 1
si si... la incluye.. pero deja.. ya tengo la causa del error... en el otro fichero usaba la libreria stdlib.h , pero en este no lo usaba y era por eso por lo que me daba el error, ya está todo arreglado... la verdá voy a tener que plantearme el dedicarme a otra cosa... porque estoy viendo que no "domino la sintaxis" jajaja.. en fin.. que gracias de todas formas.
  #11 (permalink)  
Antiguo 17/05/2005, 14:44
 
Fecha de Ingreso: febrero-2004
Ubicación: Habana
Mensajes: 6
Antigüedad: 20 años, 9 meses
Puntos: 0
NULL <=> 0, entonces no problem, una cosa, NULL puede estar definido de diferentes formas, algunas implementaciones utilizan #define ((void*)0), y por supuesto es diferente a #define NULL 0
  #12 (permalink)  
Antiguo 18/05/2005, 06:38
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Cita:
Iniciado por Hardys1983
NULL <=> 0, entonces no problem, una cosa, NULL puede estar definido de diferentes formas, algunas implementaciones utilizan #define ((void*)0), y por supuesto es diferente a #define NULL 0
El problema es que no estaba definido.
  #13 (permalink)  
Antiguo 18/05/2005, 06:39
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Cita:
Iniciado por Azrael666
si si... la incluye.. pero deja.. ya tengo la causa del error... en el otro fichero usaba la libreria stdlib.h , pero en este no lo usaba y era por eso por lo que me daba el error, ya está todo arreglado... la verdá voy a tener que plantearme el dedicarme a otra cosa... porque estoy viendo que no "domino la sintaxis" jajaja.. en fin.. que gracias de todas formas.
¿Programas en otros lenguajes?

Lo de las librerías no es dominar la sintaxis.

Lo que debes de hacer es empezar por C y sin tantos ficheros fuente. Cuando controles la sintaxis entonces vendrá todo lo demás.
  #14 (permalink)  
Antiguo 19/05/2005, 03:28
Avatar de Azrael666  
Fecha de Ingreso: noviembre-2004
Mensajes: 652
Antigüedad: 20 años
Puntos: 1
programo en pascal (y delphi), c, c++, php, sql, html y si javascript vale como lenguaje de programación pues tambien... no los domino al 100% y algunas veces meto patadas gordas jeje, pero bueno.. me defiendo con ellos... e intento aprender cada vez mas, pero cuando hago cosas nuevas como era eso de la libreria <time.h> me pierdo... es cuestion de ir poco a poco

lo que si tengo que aprender es java... a ver si por el verano me pongo a ello
  #15 (permalink)  
Antiguo 19/05/2005, 06:06
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
No, no vayas diciendo que programas en C o C++ porque puede haber después malentendidos. Di que tienes conocimientos en X lenguaje, o que te defiendes, pero no que "programas". Aún estás en la base de C y C++, porque andas preguntando sobre time.h y creas variables innecesarias, etc etc. Yo, personalmente, cuando hablo de programar me refiero a dominar mayoritariamente un lenguaje.

Java no te recomiendo que lo aprendas. Al menos _domina_ antes C++. Porque si en el verano te pones con Java, significa que llevas tres meses con C++ o parecido, y, según Bjarne Stroustrup (el creador de C++ y miembro del comité de estandarización de éste), hacer un programador de C lleva 3 meses, y uno de C++ 3 años, con lo que.....

Hazme caso, empieza _bien_ por C, apréndelo bien y luego vas a C++.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:11.