Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
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,
Has incluido las librerias pertinentes??? istream, string...ten en cuenta, que la funcion strtok no funciona demasiado bien con tipos de datos char*.
Esa sucesion de ifs, me parece un crimen contra la programacion estructurada!
Ese bucle for te sobra, y tantos ifs no son necesarios.
Lees la primera cadena, eso lo haces bien. A partir de ahi, secuencialmente, lees cada tipo de dato, hasta que encuentres el delimitador de cada campo (que puede ser un espacio blanco, un ampersand, un guion, una barra....depende de tu criterio), y lo vas guardando en su correspondiente campo de tu estructura.
Me temo que no, volcano:
2.12.3.7 fopen
Declaration:
FILE *fopen(const char *filename, const char *mode);
Opens the filename pointed to by filename. The mode argument may be one of the following constant strings:
r read text mode
w write text mode (truncates file to zero length or creates new file)
a append text mode for writing (opens or creates file and sets file pointer to the end-of-file)
rb read binary mode
wb write binary mode (truncates file to zero length or creates new file)
ab append binary mode for writing (opens or creates file and sets file pointer to the end-of-file)
r+ read and write text mode
w+ read and write text mode (truncates file to zero length or creates new file)
a+ read and write text mode (opens or creates file and sets file pointer to the end-of-file)
r+b or rb+ read and write binary mode
w+b or wb+ read and write binary mode (truncates file to zero length or creates new file)
a+b or ab+ read and write binary mode (opens or creates file and sets file pointer to the end-of-file)
Para corroborar:
Enlace PDF con draft del documento ISO/IEC 9899:TC2
Pido mis disuclpas, lo escribi justo al reves de como lo pensé!
De hecho, te voy a copiar una funcion que hice en su dia para leer datos de un archivo te texto. Espero que te sirva de algo...
void EmisoraRadio::cargarDiscoteca(string fich){
int numero;
char titulo[100],interprete[100];
ifstream f(fich.c_str());
//char buffer[100];//Para leer con el getline
char buffer[100];
while(!f.eof()){
f.getline(buffer,100,'|'); // Leo el primer campo, hasta que encuentro la |
numero=atoi(buffer); // Lo asigno a la variable numero.
f.getline(buffer,100,'|');
strcpy(titulo,buffer);
f.getline(buffer,100,'n');
strcpy(interprete,buffer);
Cancion c(titulo,interprete);
discoteca.Aumenta(c); //meto los datos en unvector dinamico
}
f.close();
}
Era en C++, pero te puede servir para orientarte. El delimitador que utilice era la barra vertical '|'.
Salu2!!!
Hola Volcano!
Vaya solo usaba la funcion getline para leer toda la linea!
No sabia avanzar de intervalo en intervalo. Ya me parecía que muy elegante no era la solucion que habia usado pero no se me habia ocurrido nada mejor.
Las librerias si que las habia incluido en mi programa:
#include <stdio.h>
#include <iostream.h> // cin
#include <stdlib.h> // funcion atoi, atof para convertir de cadena a valor numerico
#include <.h>
Voy a probarlo enseguida que llegue a casa,
Muy inspirador el ejemplo!!!
Gracias!
Oriol
Hola Volcano!
He intentando reutilizar tu codigo y creo que lo que hago es equivalente (?).
El caso es que el programa se queda colgado, no sale mensage de error simplementa el programa se queda bloqueado, debugando puedo ver que el error ocurre en el primer getline.
A ver si cuando puedas y tengas un momento puedes decirme que hago mal?!
Gracias de antemano!!!
Oriol
_)Aqui tienes las librerias que uso, compila bien, si hubiera alguna instruccion que no viniera incluida en alguna libreria no compilaria no creo que por ahi vaya el problema
_)Creo que la unica diferencia de mi codigo respecto del tuyo es que utilizo cin en vez de f.getline. Si escribo f. no me aprarece getline.
#include "lista.h"
#include <stdio.h>
#include <iostream.h> // cin
#include <stdlib.h> // funcion atoi, atof para convertir de cadena a valor numerico
#include <string.h>
int CLista::lee_lista (void)
{
int cont;
char array [70];
//mi clase
CVehiculo v;
FILE *in;
in = fopen("vehiculos.txt", "r");
if (in == NULL)
return 0;
else
{
cont = 0;
while (!feof(in))
{
//leo mi primer valor
cin.getline (array, 70, ' ');
v.pon_marca (array);
cin.getline (array, 70, ' ');
v.pon_modelo (array);
cin.getline (array, 70, ' ');
v.pon_anho ( atoi(array));
v.pon_peso ( atoi(array));
cin.getline (array, 70, ' ');
v.pon_cilindrada ( atoi(array));
cin.getline (array, 70, ' ');
v.pon_consumo ( atof(array));
cin.getline (array, 70, ' ');
v.pon_potencia ( atoi(array));
cin.getline (array, 70, ' ');
v.pon_vmax ( atoi(array));
cin.getline (array, 70, ' ');
v.pon_tipo_motor ( array);
cin.getline (array, 70, ' ');
v.pon_deposito ( atof(array));
cin.getline (array, 70, ' ');
v.pon_relacion_compresion ( array);
cin.getline (array, 70, 'n');
v.pon_relacion_peso_pot ( atof(array));
pon_vehiculo (cont, v);
cont++;
}
pon_numero_vehiculos (cont); // este es el # de personas que hay en la lista
}
return 1;
}
En principio el codico que adjuntas esta bien. Piensa en que tambien puede que falle el debugger del entonrno de programacion que utilices. ¿Con que IDE programas?