cargar struct dentro de una matriz

Iniciado por eriss_15, 17 Mayo 2012, 22:43 PM

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

eriss_15

Hola, quería saber si alguien me podría ayudar con esto...
Tengo q hacer un estructura q contenga 3 datos y esta misma por una función cargarla dentro de una matriz. esa matriz después me va a servir para actualizar un archivo, q solo se actualiza si el tipo es distinto de 99 y la producción distinta de 0




#include <conio.h>
#include <stdio.h>
#define TAM 3
typedef struct
{
   int tipo;
   float produccion;
   float valor;
}t_parcela;
void ver_archivo(FILE*);
void cargar_matriz(t_parcela*[][TAM]);
void main()
{
   int i,j;
   FILE*pf;
   t_parcela parcela[TAM][TAM];
   cargar_matriz(parcela);
   pf=fopen("campo.dat","w+b");
   {
      for(i=0;i<TAM;i++)
         for(j=0;j<TAM;j++)
         {
            if(parcela[j].produccion!=0 && parcela[j].tipo!=99)
            {
               fseek(pf,((i*TAM)+j+1)*sizeof(t_parcela),0);
               fwrite(&parcela[j].tipo,sizeof(int),1,pf);
               fwrite(&parcela[j].produccion,sizeof(float),1,pf);
               fwrite(&parcela[j].valor,sizeof(float),1,pf);
               fseek(pf,(-1L)*sizeof(t_parcela),1);
               fseek(pf,0,1);
            }
         }
   }
   fclose(pf);
   ver_archivo(pf);
   getch();
}
void cargar_matriz(t_parcela *p[TAM][TAM])
{
   int i,j;
   for(i=0;i<TAM;i++)
      for(j=0;j<TAM;j++)
         {
              puts("Escriba el tipo de grano(entero de 1 a 5)");
             scanf("%d",&p[j]->tipo);
             puts("Escriba la produccion obtenida");
             scanf("%f",&p[j]->produccion);
             puts("Escriba el valor de la produccion");
             scanf("%f",&p[j]->valor);
         }
}
void ver_archivo(FILE*pf)
{
   t_parcela parcela;
         pf=fopen("campo.dat","rb");
         fread(&parcela,sizeof(t_parcela),1,pf);
         while(!feof(pf))
         {
            printf("%d",parcela.tipo);
            printf("%f",parcela.produccion);
            printf("%f",parcela.valor);
            fread(&parcela,sizeof(t_parcela),1,pf);
         }
         fclose(pf);
}


el programa sin querer cargar la matriz anda barbaro pero quiero cargarle un par de datos y despues ver el archivo para ver si al grabar quedo bien,,,
Desde ya Graciaaaas..!

exel

#1
 De acuerdo a lo que dices, he corregido errores potenciales del codigo, aunque no estoy conforme porque no se ajusta a especificaciones estandar.

No lo he probado pero creo que esta bien, sin embargo observa las correcciones que hice.


#include <conio.h>
#include <stdio.h>
#define TAM 3

typedef struct
{
  int tipo;
  float produccion;
  float valor;
}t_parcela;

void ver_archivo(FILE*);
void cargar_matriz(t_parcela*[][TAM]);

void main()
{
  int i,j;
  FILE*pf;
  t_parcela parcela[TAM][TAM];
  cargar_matriz(parcela);
  pf=fopen("campo.dat","w+b");
  {
     for(i=0;i<TAM;i++)
        for(j=0;j<TAM;j++)
        {
           if(parcela[i][j].produccion!=0 && parcela[i][j].tipo!=99)
           {
              fseek(pf,((i*TAM)+j)*sizeof(t_parcela),SEEK_SET);
              fwrite(&parcela[i][j],sizeof(parcela),1,pf);
           }
        }
  }
  fclose(pf);
  ver_archivo(pf);
  getch();
}

void cargar_matriz(t_parcela p[TAM][TAM])
{
  int i,j;
  for(i=0;i<TAM;i++)
     for(j=0;j<TAM;j++)
        {
            puts("Escriba el tipo de grano(entero de 1 a 5)");
            scanf("%d",&p[i][j].tipo);
            puts("Escriba la produccion obtenida");
            scanf("%f",&p[i][j].produccion);
            puts("Escriba el valor de la produccion");
            scanf("%f",&p[i][j].valor);
        }
}

void ver_archivo(FILE*pf)
{
  t_parcela parcela;
        pf=fopen("campo.dat","rb");
        fread(&parcela,sizeof(t_parcela),1,pf);
        while(!feof(pf))
        {
           printf("%d",parcela.tipo);
           printf("%f",parcela.produccion);
           printf("%f",parcela.valor);
           fread(&parcela,sizeof(t_parcela),1,pf);
        }
        fclose(pf);
}


Antes te sugiero que modifiques las salidas de los printf() agregando espacios como saltos de lineas para que puedas leer mejor los resultados.

Saludos