[AYUDA] Error con función cargar archivo.

Iniciado por Black cracker, 2 Septiembre 2015, 19:30 PM

0 Miembros y 1 Visitante están viendo este tema.

Black cracker

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:

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);
}

ivancea96


Black cracker

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.

someRandomCode

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..

Black cracker

ya modifique un poco la funcion, ya me carga pero los chars a la hora de imprimirlos o listarlos me tira basura..

FUNCION CARGAR
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 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++;
}

Black cracker

me tira algo asi en la consola ...

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

LISTANDO INVENTARIO

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

someRandomCode

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..

Black cracker

 :huh: ;D ;D
Ahh bien. Una pregunta como usaria el strncpy en este caso? gracias de antemano bro  ;-)

someRandomCode

#8
tendrias que hacer algo como:
Código (cpp) [Seleccionar]

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(Archivo,"%s%i%s%i",nombre,&cantidad,fabricante,&codigo);
                       nuevo = new(componentes);
                       strncpy(nuevo->nombre,nombre,largo_maximo_nuevo_nombre);
......


Fijate de cualquier manera que estas mezclando C con C++, asique para la lectura deberias usar, para no complicarte:
Código (cpp) [Seleccionar]

std::string buffer;
std::ifstream Archivo("MiBaseDeDatos.txt");
std::cin.getline(archivo,buffer);


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