Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Almacenar datos de fichero en estructura

Estas en el tema de Almacenar datos de fichero en estructura en el foro de C/C++ en Foros del Web. Hola a todos! Miren, lo que me ocurre es que nos acaban de explicar en clase muy por encima lo que son los struct y ...
  #1 (permalink)  
Antiguo 26/01/2014, 05:35
 
Fecha de Ingreso: enero-2014
Mensajes: 3
Antigüedad: 10 años, 3 meses
Puntos: 0
Almacenar datos de fichero en estructura

Hola a todos! Miren, lo que me ocurre es que nos acaban de explicar en clase muy por encima lo que son los struct y como funcionan, por lo que sé bastante poco, y resulta que nuestro profesor, nos ha mandado hacer un ejercicio que debe hacer lo siguiente:
Leer una serie de datos en un fichero que están estructurados en 3 columnas(por lo que los leo con fscanf) y almacenar estos en una estructura de datos para posteriormente volverlos a escribir un fichero nuevo.
Yo me he ido informando y he estado viendo que hay casos en los que se usa memoria dinámica o algo así, y es algo que nunca hemos visto y que además el profesor ha descartado. Parece ser que tengo que usar struct con vectores, pero con lo que intento siempre me da error. Esto es un intento:

Código:
#include <stdio.h>
#include <string.h>

#define N 200

struct productos{
	char codigoLeidoFichero[50];
	char nombre[50];
	double *precio;
};




int leerFichero(struct productos prod[])
{
	int i=0;
	FILE*f1=fopen("productos.txt","r");
	if(f1==NULL)
	{
		printf("Error al abrir el archivo\n");
		
	}
	else
	{
		while(!feof(f1))
		{
			fscanf(f1,"%s %s %lf",prod[i].codigoLeidoFichero,prod[i].nombre,prod[i].precio);
			i++;
		}
	}
	fclose(f1);
	return i;
}

void EscribirNuevoFichero(int i, struct productos prod[])
{
	int j=0;
	FILE*f1=fopen("nuevo.txt","w");
	while(j<=i)
	{
		fprintf(f1,"%s %s %lf",prod[j].codigoLeidoFichero,prod[j].nombre,*prod[j].precio);
		j++;
	}
	fclose(f1);
}
int main(void)
{
	struct productos prod[N];
	int i;
	
	leerFichero(prod);
	EscribirNuevoFichero(i,prod);
	return 0;
}
Como ven, mi estilo de programación no es muy bueno, pero ya irá mejorando, espero que podáis ayudarme; llevo mucho tiempo rompiéndome la cabeza
Muchas gracias!!
  #2 (permalink)  
Antiguo 26/01/2014, 05:45
Avatar de iFuSiiOnzZ  
Fecha de Ingreso: junio-2012
Mensajes: 8
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: Almacenar datos de fichero en estructura

Mirando por encima varios apuntes:
1 - En la struct precio lo tienes declarado como puntero, quita el * para que sea una variable normal.
2 - En fscanf tienes que pasar la posicion de memoria del prod[i].precio, esto lo haces poniendo & delante (para los arrays o vectores no hace falta).
3 - En fprintf quita el * del prod[j].precio.

Lo demas
  #3 (permalink)  
Antiguo 26/01/2014, 06:04
 
Fecha de Ingreso: enero-2014
Mensajes: 3
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Almacenar datos de fichero en estructura

Muchas gracias!! ya funciona! El único problema es que me escribe solo la primera línea. ¿Cómo hago para que me escriba todo?
  #4 (permalink)  
Antiguo 26/01/2014, 06:10
Avatar de iFuSiiOnzZ  
Fecha de Ingreso: junio-2012
Mensajes: 8
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: Almacenar datos de fichero en estructura

Se me paso algo por algo, en el main lo que devuelva leerFichero(...) se lo tienes que asignar a la i que si no la i tendra un valor "random". Puede que sea esa la causa. En todo caso, usa printf para "debuggear".
  #5 (permalink)  
Antiguo 26/01/2014, 06:24
 
Fecha de Ingreso: enero-2014
Mensajes: 3
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Almacenar datos de fichero en estructura

Cita:
Iniciado por iFuSiiOnzZ Ver Mensaje
Se me paso algo por algo, en el main lo que devuelva leerFichero(...) se lo tienes que asignar a la i que si no la i tendra un valor "random". Puede que sea esa la causa. En todo caso, usa printf para "debuggear".
La verdad es que me funciona tanto asignando como si no. La cosa es que ahora necesito que el programa me devuelva uno de esos productos si yo le escribo en pantalla su "código". He realizado alguna modificación para ello:
Código:
#include <stdio.h>
#include <string.h>

#define N 200

struct productos{
	char codigoLeidoFichero[50];
	char nombre[50];
	double precio;
};




int leerFichero(struct productos prod[])
{
	int i=0;
	FILE*f1=fopen("productos.txt","r");
	if(f1==NULL)
	{
		printf("Error al abrir el archivo\n");
		
	}
	else
	{
		while(!feof(f1))
		{
			fscanf(f1,"%s %s %lf\n",prod[i].codigoLeidoFichero,prod[i].nombre,&prod[i].precio);
			i++;
		}
	}
	fclose(f1);
	return i;
}

void EscribirNuevoFichero(int i, struct productos prod[])
{
	char codigo[50];
	int j=0;
	FILE*f1=fopen("nuevo.txt","w");
	while(j<=i)
	{
		fprintf(f1,"%s %s %lf\n",prod[j].codigoLeidoFichero,prod[j].nombre,prod[j].precio);
		
		if(strcmp(codigo,prod[j].codigoLeidoFichero)==0)
		{
			printf("El producto existe y es: %s %s %lf\n", prod[j].codigoLeidoFichero,prod[j].nombre,prod[j].precio);
		}
		else
		{
			printf("El producto no ha sido encontrado");
		}
		j++;
	}
	fclose(f1);
}
int main(void)
{	
	char codigo[50];
	struct productos prod[N];
	int i;
	printf("Introduce codigo: ");
	scanf("%s",codigo);
	leerFichero(prod);
	EscribirNuevoFichero(i,prod);
	return 0;
}
Lo que no se muy bien es qué tengo que poner después del strcmp para que me escriba exactamente lo que me ha encontrado. Muchas gracias

Etiquetas: arrays, estructura, ficheros, struct, vectores
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 20:44.