Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: eriss_15 en 17 Mayo 2012, 22:43 pm



Título: cargar struct dentro de una matriz
Publicado por: eriss_15 en 17 Mayo 2012, 22:43 pm
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..!


Título: Re: cargar struct dentro de una matriz
Publicado por: exel en 18 Mayo 2012, 06:33 am
 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.

Código
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #define TAM 3
  4.  
  5. typedef struct
  6. {
  7.   int tipo;
  8.   float produccion;
  9.   float valor;
  10. }t_parcela;
  11.  
  12. void ver_archivo(FILE*);
  13. void cargar_matriz(t_parcela*[][TAM]);
  14.  
  15. void main()
  16. {
  17.   int i,j;
  18.   FILE*pf;
  19.   t_parcela parcela[TAM][TAM];
  20.   cargar_matriz(parcela);
  21.   pf=fopen("campo.dat","w+b");
  22.   {
  23.      for(i=0;i<TAM;i++)
  24.         for(j=0;j<TAM;j++)
  25.         {
  26.            if(parcela[i][j].produccion!=0 && parcela[i][j].tipo!=99)
  27.            {
  28.               fseek(pf,((i*TAM)+j)*sizeof(t_parcela),SEEK_SET);
  29.               fwrite(&parcela[i][j],sizeof(parcela),1,pf);
  30.            }
  31.         }
  32.   }
  33.   fclose(pf);
  34.   ver_archivo(pf);
  35.   getch();
  36. }
  37.  
  38. void cargar_matriz(t_parcela p[TAM][TAM])
  39. {
  40.   int i,j;
  41.   for(i=0;i<TAM;i++)
  42.      for(j=0;j<TAM;j++)
  43.         {
  44.             puts("Escriba el tipo de grano(entero de 1 a 5)");
  45.             scanf("%d",&p[i][j].tipo);
  46.             puts("Escriba la produccion obtenida");
  47.             scanf("%f",&p[i][j].produccion);
  48.             puts("Escriba el valor de la produccion");
  49.             scanf("%f",&p[i][j].valor);
  50.         }
  51. }
  52.  
  53. void ver_archivo(FILE*pf)
  54. {
  55.   t_parcela parcela;
  56.         pf=fopen("campo.dat","rb");
  57.         fread(&parcela,sizeof(t_parcela),1,pf);
  58.         while(!feof(pf))
  59.         {
  60.            printf("%d",parcela.tipo);
  61.            printf("%f",parcela.produccion);
  62.            printf("%f",parcela.valor);
  63.            fread(&parcela,sizeof(t_parcela),1,pf);
  64.         }
  65.         fclose(pf);
  66. }
  67.  

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

 Saludos