Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Black cracker en 2 Septiembre 2015, 19:30 pm



Título: [AYUDA] Error con función cargar archivo.
Publicado por: Black cracker en 2 Septiembre 2015, 19:30 pm
Hola gente.
Una duda, se me ha presentado un error en esta función dado que no funciona, jaja. Digamos que no me carga el archivo deseado, ayuda.  :huh: ;D

Acá la función:

Código:
void cargar(Ptrcomponente &listas){
string nombre;
int cantidad;
string fabricante;
int codigo;
Ptrcomponente nuevo;
FILE*Archivo;
fopen_s(&Archivo, "Base de datos.txt", "r+");
if (Archivo == NULL){ printf("ERROR"); }
else{
while (!feof(Archivo)){
fscanf_s(Archivo, "%s", &nombre);
fscanf_s(Archivo, "%i", &cantidad);
fscanf_s(Archivo, "%s", &fabricante);
fscanf_s(Archivo, "%i", &codigo);
nuevo = new(componentes);
nuevo->nombre = nombre;
nuevo->cantidad = cantidad;
nuevo->fabricante = fabricante;
nuevo->codigo = codigo;
nuevo->siguiente = NULL;
agregar(nuevo, listas);
}
}
fclose(Archivo);
}


Título: Re: [AYUDA] Error con función cargar archivo.
Publicado por: ivancea96 en 2 Septiembre 2015, 19:55 pm
¿Qué te carga entonces?


Título: Re: [AYUDA] Error con función cargar archivo.
Publicado por: Black cracker en 2 Septiembre 2015, 23:20 pm
no me carga los strings.. creo que hay un problema con los fscanf_s con strings, pero no se cual es o como solucionarlo, gracias.


Título: Re: [AYUDA] Error con función cargar archivo.
Publicado por: someRandomCode en 3 Septiembre 2015, 00:17 am
Si, es para errores..
fscanf carga strings de C, no de C++.
O sea que no podes usar el std::string, tendrias que usar un array de char para recibir el valor, entre otras cosas que veo en primera medida como que podrias usar un solo fscanf para levantar todos los valores..
Lo mismo el nuevo = new (componentes);
deberias especificar la clase y no veo donde esta definido componentes junto con los nuevos valores..


Título: Re: [AYUDA] Error con función cargar archivo.
Publicado por: Black cracker en 3 Septiembre 2015, 04:11 am
ya modifique un poco la funcion, ya me carga pero los chars a la hora de imprimirlos o listarlos me tira basura..

FUNCION CARGAR
Código:
void cargar(Ptrcomponente &listas){
char nombre[20];
char nombre_1;
//nombre_1 = str.copy(nombre, 20, 5); intentando que no me tire basura
int cantidad;
char fabricante[20];
char fabricante_1 = str.copy(nombre, 20, 5);
int codigo;
Ptrcomponente nuevo;
FILE*Archivo;
fopen_s(&Archivo, "Base de datos.txt", "r+");
if (Archivo == NULL){ printf("ERROR"); }
else{
while (!feof(Archivo)){
fscanf_s(Archivo, "%s", nombre, 20);
fscanf_s(Archivo, "%i", &cantidad);
fscanf_s(Archivo, "%s", fabricante, 20);
fscanf_s(Archivo, "%i", &codigo);
nuevo = new(componentes);
nuevo->nombre = nombre;
nuevo->cantidad = cantidad;
nuevo->fabricante = fabricante;
nuevo->codigo = codigo;
nuevo->siguiente = NULL;
agregar(nuevo, listas);
}
}
fclose(Archivo);
}

FUNCION listar
Código:
void listar(Ptrcomponente &listas){
Ptrcomponente aux;
aux = listas;
int cont = 1;
while (aux != NULL){
printf("%d", cont);
printf("%s", aux->nombre);
printf("%d", aux->cantidad);
printf("%s", aux->fabricante);
printf("%d\n", aux->codigo);
aux = aux->siguiente;
cont++;
}


Título: Re: [AYUDA] Error con función cargar archivo.
Publicado por: Black cracker en 3 Septiembre 2015, 04:13 am
me tira algo asi en la consola ...

-------Menu principal ------

LISTANDO INVENTARIO

1╠╠╠╠╠╠╠╠1233╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠123
2╠╠╠╠╠╠╠╠1233╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠123
3╠╠╠╠╠╠╠╠234╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠2342
4╠╠╠╠╠╠╠╠23╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠32424


Título: Re: [AYUDA] Error con función cargar archivo.
Publicado por: someRandomCode en 3 Septiembre 2015, 05:48 am
como es la definicion de la clase que estas usando?
Otra cosa, si estas usando strings al estilo C para almacenar los datos, un a=b; no es suficiente, deberias usar strncpy.
Cuando haces nuevo->nombre = nombre; toma la direccion de memoria del primer elemento de nombre en nuevo->nombre;
que, a todo esto, parece que fuera una estructura y no una clase, o que has puesto las variables como publicas y no como privadas, cosa que seria un mal diseño...
En POO se suelen hacer Getters y Setters, getters para obtener los valores y setters para poner los valores. Que sea dicho de paso, se llaman en realidad "estado" del objeto o propiedades del mismo..


Título: Re: [AYUDA] Error con función cargar archivo.
Publicado por: Black cracker en 3 Septiembre 2015, 06:13 am
 :huh: ;D ;D
Ahh bien. Una pregunta como usaria el strncpy en este caso? gracias de antemano bro  ;-)


Título: Re: [AYUDA] Error con función cargar archivo.
Publicado por: someRandomCode en 3 Septiembre 2015, 15:17 pm
tendrias que hacer algo como:
Código
  1. void cargar(Ptrcomponente &listas){
  2. char nombre[20];
  3. char nombre_1;
  4. //nombre_1 = str.copy(nombre, 20, 5); intentando que no me tire basura
  5. int cantidad;
  6. char fabricante[20];
  7. char fabricante_1 = str.copy(nombre, 20, 5);
  8. int codigo;
  9. Ptrcomponente nuevo;
  10. FILE*Archivo;
  11. fopen_s(&Archivo, "Base de datos.txt", "r+");
  12. if (Archivo == NULL){ printf("ERROR"); }
  13. else{
  14. while (!feof(Archivo)){
  15. fscanf(Archivo,"%s%i%s%i",nombre,&cantidad,fabricante,&codigo);
  16.                        nuevo = new(componentes);
  17.                        strncpy(nuevo->nombre,nombre,largo_maximo_nuevo_nombre);
  18. ......
  19.  

Fijate de cualquier manera que estas mezclando C con C++, asique para la lectura deberias usar, para no complicarte:
Código
  1. std::string buffer;
  2. std::ifstream Archivo("MiBaseDeDatos.txt");
  3. std::cin.getline(archivo,buffer);
  4.  

Y revisa bien la estructura de tu objeto porque si es para una tarea te van a retar :P

EDITO: Mejor que irlo refactoreando a C++ empecemos a hacerlo de nuevo en C++ no te parece? :P