fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

corrupcion de datos
 
Avisos
Vaciar todo

corrupcion de datos

22 Respuestas
4 Usuarios
0 Reactions
178.7 K Visitas
oriol
Respuestas: 18
Topic starter
(@oriol)
Active Member
Registrado: hace 13 años

Hola!

Tengo un problema que me esta volviendo loco y no se como resolverlo.

Es un programa trivial.
El programa carga las performances de unos vehiculos (desde un doc.txt) y el usuario las puede consultar a traves de una interfaz vb (DLL) o en C directamente.

Mi problema es que si debugo puedo comprobar como mis datos se cargan correctamente, los datos son de tres tipos int, float y string.

El problema aparece al consultar mis datos por pantalla. Hay dos vehiculos que en vez de retornar los valores int (fecha_construccion) me sale por pantalla un valor arbitrario.

Si lo ejecuto el programa en la version DLL los datos que fallan son en varios vehiculos, no como en C, eso si solo fallan valores declarados integer en C y que los manejo como tipo single en visual.

La duda es por que al debugar si parece que el programa se ejecute sin problemas, en el momento de ejecutar el programa falla?

Es un error muy esquivo!! Con anterioridad tuve problemas al leer strings mezclados con numeros, si declaraba un valor string con un espacio de memoria muy grande (ej, cadena[30]) y luego leia pocas letras, a veces la cadena se llevaba parte del valor numerico que habia despues de esta: no paraba de leer al llegar ' ' a un espacio en blanco.
No se si el error puede ser algo asi.

Un trozo de la funcion lee datos, las variables son las que corresponden en cada caso float, int...

in = fopen("vehiculos.txt", "r");
if (in == NULL)
return 0;
else
{
cont=0;
while (!feof(in))
{
fscanf(in,"%s", m);
v.pon_marca ( m);
fscanf(in," %s", n);
v.pon_modelo (n);
fscanf(in," %d", &a);
v.pon_anho ( a);
fscanf (in," %d", &b);
v.pon_peso ( b);
fscanf (in," %d", &c);
v.pon_cilindrada ( c);
fscanf (in," %f", & f);

S http://foro.webdearde.com/posting.php?mode=post&f=16&sid=eb4f8dd8841fff4a0167c13dc4cf6305# i" onclick="window.open(this.href);return false; no soy capaz de hacer que funcione un scanf no se que programa puedo hacer que sirva de algo!

Os agradezco cualquier comentario que podais hacerme!

Gracias de antemano,

Responder
21 respuestas
volcano
Respuestas: 51
(@volcano)
Trusted Member
Registrado: hace 15 años

Yo empezaria por poner el codigo completo de la funcion/procedimiento en cuestión. Te falta al final del while volver a leer la linea, para que cuando vuelva a comprobar si eof() en la condicion del while, pueda detectar el final del archivo. Por otro lado, mucho cuidado al usar fscanf...es muy puñetero. Yo intentaria usar fgets, fgetc...
Si pones el codigo completo será mas facil ayudarte!

Responder
oriol
Respuestas: 18
Topic starter
(@oriol)
Active Member
Registrado: hace 13 años

Hola volcano!

Gracias por tu respuesta!

No sabia que existian otras funciones equivalentes al scanf!
Tratare de volver a usar el programa con las funciones que comentas: fgets, fgetc...
Tiene pinta que el lio lo con los datos es debido al scanf.

Te adjunto el codigo que he usado para mi función leo_datos:

-)Tus indicaciones son de gran ayuda!!!!!!!!!!!!!!!!!!!!!!!!!!

Oriol

int CLista::lee_lista (void)
{
// mis variables
int a, b, c, d, e, cont;
float f, g, i;
char m [20];
char n [20];
char p [20];
char h [5];

//mi clase
CVehiculo v;

FILE *in;

in = fopen("vehiculos.txt", "r");
if (in == NULL)
return 0;
else
{
cont=0;
while (!feof(in))
{
fscanf(in,"%s", m);
v.pon_marca ( m);
fscanf(in," %s", n);
v.pon_modelo (n);
fscanf(in," %d", &a);
v.pon_anho ( a);
fscanf (in," %d", &b);
v.pon_peso ( b);
fscanf (in," %d", &c);
v.pon_cilindrada ( c);
fscanf (in," %f", & f);
v.pon_consumo ( f);
fscanf (in," %d", &d);
v.pon_potencia ( d);
fscanf (in," %d", &e);
v.pon_vmax ( e);
fscanf (in," %s", p);
v.pon_tipo_motor ( p);
fscanf (in," %f", &g);
v.pon_deposito ( g);
fscanf (in," %s", &h);
v.pon_relacion_compresion ( h);
fscanf (in," %f", &i);
v.pon_relacion_peso_pot ( i);
pon_vehiculo (cont, v);

cont= cont++;
}
pon_numero_vehiculos (cont); // este es el # de personas que hay en la lista
}

return 1;
}

Responder
volcano
Respuestas: 51
(@volcano)
Trusted Member
Registrado: hace 15 años

Veamos pues...
Debes tener en cuenta, el modo de apertura del fichero. En tu caso, lo habres en modo binario, que aunque omites la "b" en la funcion fopen, debes poner "rb".

¿El archivo es binario o de texto?

Si me permites una recomendacion...yo leeria el archivo de la siguiente forma.

Lees una linea completa, con todoslos campos del registro, en una variable auxiliar. Luego, teniendo en cuenta lo que ocupa cada dato (int, char, etc...) vas copiando a tu estructura los datos de esa variable auxiliar. ¿Que consigues con esto? Haces un solo acceso a disco para leer cada registro con el consiguiente incremento de eficiencia. Tambien te ahorras tener tantisimos fscanf.

Hay otra fucion estandar de C, cin.getline(), la puedes utilizar sin problemas, y ademas no te fallara comos scanf.

Por ultimo, si usas getline, puedes hacerlo de la siguiiente forma:

while(cin.getline(......)!=eof()){
//aqui tu codigo
}

Y asi te leera todas las lineas del fichero hasta que el descriptor del archivo le devuelva eof.

Creo que te debe funcionar.

Tambien depende del entorno de programacion que uses...

Si programas en C o C++ como es tu caso, consulta la referencia del estandar para saber que pros y que contras te ofrece cada funcion.

Salu2!

Responder
thoron
Respuestas: 33
(@thoron)
Eminent Member
Registrado: hace 14 años

añadir un detalle a lo dicho por volcano:
Si lo ejecuto el programa en la version DLL los datos que fallan son en varios vehiculos, no como en C, eso si solo fallan valores declarados integer en C y que los manejo como tipo single en visual.

¿Los datos de tipo single en visual basic no son de coma flotante? Lo digo por que me sonaba algo así, y googleando me sale como que son como un float sólo que de menor tamaño. Si en C los declaras como integer... pues es bastante normal que no funcionen bien.

Puedes leer como se organizan los datos en los 4 bytes de una variable single, por ejemplo, aquí.

Responder
Página 1 / 5
Compartir: