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

Problema estructuras

Estas en el tema de Problema estructuras en el foro de C/C++ en Foros del Web. Buenas, tengo un problema: Ayer hice una pequeña agenda de notas para practicar un poco, un fichero binario con estructuras, todo funciona bien menos al ...
  #1 (permalink)  
Antiguo 15/10/2008, 09:17
 
Fecha de Ingreso: marzo-2008
Mensajes: 37
Antigüedad: 16 años, 1 mes
Puntos: 0
Problema estructuras

Buenas, tengo un problema:

Ayer hice una pequeña agenda de notas para practicar un poco, un fichero binario con estructuras, todo funciona bien menos al mostrarme los datos, que hay algunas notas que se repiten( esto no se si es problema de al mostrar datos, o al escribirlos en el fichero)

Por ejemplo:

Yo le inserto en Catalan la nota 1 y hago un listado de notas y me muestra:

Código:
Notas [Catalan]:
> 1
Notas [Castellano]:
Notas [Matematicas]:
Notas [Ingles]:

Luego inserto la nota 5 en matematicas y al hacer el listado, sorpresa:


Código:
Notas [Catalan]:
> 1
> 1
Notas [Castellano]:
Notas [Matematicas]:
> 5
Notas [Ingles]:

Como ven, salen 2 "1", uno lo puse yo, pero y el otro? He revisado una y otra vez el codigo y no encuentro nada que pueda ser:

Las estructuras son estas:



Código:
typedef struct
{
	int nota_catalan;
	int nota_castellano;
	int nota_mates;
	int nota_ingles;

}MATERIAS;

typedef struct __notas
{
   
	int trimestre;
	MATERIAS m;
	struct __notas *sig;

}NOTAS;

Las funciones de escribir, leer son estas:

Escribe en un fichero la estructura con las notas


Código:
int 
carga_fichero(int nota, int materia, int trimestre)
{

int df;
   nodo p;

              if(( df = open("notas.dat",O_WRONLY | O_APPEND | O_CREAT,0600)) == -1)
              {
					  perror("notas.dat");
                 return -1;
              }

              p=inicializa(p);

              if(!p)
					  return -1;

              if( materia == 1)
					  p->m.nota_catalan=nota;
				  else if( materia == 2 )
					  p->m.nota_castellano=nota;
				  else if( materia == 3)
					  p->m.nota_mates=nota;
				  else if( materia == 4)
					  p->m.nota_ingles=nota;
				  else
				  {
					  fprintf(stderr,"Materia [%d] desconocida\n",materia);
					  return -1;
				  }
				  
				  
				  p->trimestre=trimestre;
				  
				  write(df,p,sizeof(NOTAS));

              free(p);

              close(df);

      return 0;

}

Lee fichero y devuelve estructura:


Código:
lista 
carga_notas(void)
{
	nodo p;
	int d_n;
	int r_bytes;
	lista l=NULL;
	int indice=0;
	                  if(( d_n = open("notas.dat",O_RDONLY)) == -1)
							{
								perror("2datos.dat");
								return NULL;
							}
							
							p=inicializa(p);
							
							if(!p)
								return NULL;
							
							while(( r_bytes=read(d_n,p,sizeof(NOTAS)) ) > 0)
                     {
								p->sig=l;
								l=p;
								p=inicializa(p);
							}

                     free(p);

                     close(d_n);

           return l;

}

Muestra notas

Código:
void mostrar_total_notas(lista l, unsigned int assig)
{
	nodo p;

	   p=l;

	        while(p)
			  {
				  if(assig == 0)
				  { 
					  
			    	  if ( p->m.nota_catalan != 0)
					  {
						  printf("NOTAS CATALAN\n");
					     printf("> %d\n",p->m.nota_catalan);
					  }
				  }
              else if(assig == 1)
				  {
					  if(p->m.nota_castellano != 0)
					  printf("> %d\n",p->m.nota_castellano);
				  }
				  else if(assig == 2)
				  {
					  if(p->m.nota_mates != 0)
					  printf("> %d\n",p->m.nota_mates);
				  }
				  else
				  {
					  if(p->m.nota_ingles != 0)
					  printf("> %d\n",p->m.nota_ingles);
				  }

				  p=p->sig;
			  }
}

Yo no le veo nada extraño, y de hecho no se porque me lo hace..., a ver si alguien puede arrojar un poco de luz, porque estoy algo preucupado.

Muchas gracias
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 12:21.