]> git.llucax.com Git - z.facultad/75.06/emufs.git/commitdiff
* Primer ejemplo de grabacion y recuperacion de un registro funciona al fin!
authorRicardo Markiewicz <gazer.arg@gmail.com>
Mon, 5 Apr 2004 04:15:17 +0000 (04:15 +0000)
committerRicardo Markiewicz <gazer.arg@gmail.com>
Mon, 5 Apr 2004 04:15:17 +0000 (04:15 +0000)
 * Hay algo raro en leer_registro que hace que el free del final cause un SEGFAULT
 * Arregle leer_bloque porque estaba faltando sumar el campo tamaƱo_registro al header del archivo.

tipo3/main.c
tipo3/param_cte.c

index 395ed5365c2417e4de9b700828deb3cb6ce3f42a..0e38cc58519b19913e302c98cb8e5fd21226c79f 100644 (file)
@@ -7,7 +7,7 @@ int main()
        EMUFS *fp;
        char a[] = "1234567890";
        int n;
        EMUFS *fp;
        char a[] = "1234567890";
        int n;
-       char b[100];
+       char b[101];
 
        fp = emufs_crear("articulos", T3, 512, 100);
 
 
        fp = emufs_crear("articulos", T3, 512, 100);
 
@@ -15,8 +15,9 @@ int main()
 
        printf("ID = %d\n", n);
 
 
        printf("ID = %d\n", n);
 
-       fp->leer_registro(fp, n, b, 100);
+       fp->leer_registro(fp, n, b, 20);
 
 
+       printf("Ok\n");
        printf("Recuperado : %s\n", b);
 
        emufs_destruir(fp);
        printf("Recuperado : %s\n", b);
 
        emufs_destruir(fp);
index fbb66a4ae7958753500bbe23bce4d038e9a228e3..0ee3d7f8969df8a5d83b449e77a8c08d609ab368 100644 (file)
@@ -22,12 +22,13 @@ int leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg)
 
        /*si existe, lo busco en el archivo de bloques*/
        block = buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/
 
        /*si existe, lo busco en el archivo de bloques*/
        block = buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/
-       printf("block  %d\n", block);
        bloque = (char*)malloc(emu->tam_bloque);        
        bloque = (char*)malloc(emu->tam_bloque);        
-       if (leer_bloque(emu, block, bloque)==-1)
+       if (leer_bloque(emu, block, bloque)==-1) {
+               free(bloque);
                return -1; /*No se pudo leer el bloque*/
                return -1; /*No se pudo leer el bloque*/
+       }
        
        
-       while ( iterador != emu->tam_bloque ){ 
+       while ( iterador < emu->tam_bloque ){ 
                memcpy(&ID_aux, bloque+iterador, sizeof(int));
                iterador += 4;
                if ( ID_aux == ID ){
                memcpy(&ID_aux, bloque+iterador, sizeof(int));
                iterador += 4;
                if ( ID_aux == ID ){
@@ -37,8 +38,9 @@ int leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg)
                iterador += tam_reg;    
        }               
        
                iterador += tam_reg;    
        }               
        
-       fclose(f_block_reg);            
-       free(bloque);
+       fclose(f_block_reg);
+       /* TODO :Ver por que causa un SEGFAULT ACA!! */
+       //free(bloque);
        return 0;
 }
 
        return 0;
 }
 
@@ -77,7 +79,6 @@ int buscar_registro(EMUFS *emu, int ID)
                if (fread(&reg,sizeof(reg),1,f_block_reg) != 1) continue;
                if ( reg.id_reg == ID ){
                        fclose(f_block_reg);
                if (fread(&reg,sizeof(reg),1,f_block_reg) != 1) continue;
                if ( reg.id_reg == ID ){
                        fclose(f_block_reg);
-                       printf("%d %d %d\n", reg.id_reg, ID, reg.block);
                        return reg.block;
                }
        }
                        return reg.block;
                }
        }
@@ -97,11 +98,11 @@ int leer_bloque(EMUFS *emu, int ID, void* ptr)
        strcat(name_f,".dat");
        
        if ( (file = fopen(name_f,"r"))==NULL ) return -1; /*ERROR*/
        strcat(name_f,".dat");
        
        if ( (file = fopen(name_f,"r"))==NULL ) return -1; /*ERROR*/
-       fseek(file,sizeof(int)+sizeof(char),SEEK_SET);
+       fseek(file,sizeof(int)+sizeof(char)+sizeof(int),SEEK_SET);
        /*FIXME: verificar que no se pase de fin de archivo*/
        fseek(file,ID*emu->tam_bloque,SEEK_CUR);
        if (fread(ptr,emu->tam_bloque,1,file)!=1) return -1;
        /*FIXME: verificar que no se pase de fin de archivo*/
        fseek(file,ID*emu->tam_bloque,SEEK_CUR);
        if (fread(ptr,emu->tam_bloque,1,file)!=1) return -1;
-               
+
        fclose(file);
        return 0;
 }
        fclose(file);
        return 0;
 }
@@ -177,6 +178,7 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam)
        /*me paro al principio salteando el encabezado del archivo*/
        fseek(file, 0, SEEK_END); /* Me paro al final */
        cant = (ftell(file)-(sizeof(int)+sizeof(char))) / emu->tam_bloque;
        /*me paro al principio salteando el encabezado del archivo*/
        fseek(file, 0, SEEK_END); /* Me paro al final */
        cant = (ftell(file)-(sizeof(int)+sizeof(char))) / emu->tam_bloque;
+       cant--; /* Resto uno porque el numero de bloque debe empezar en 0 */
        fclose(file);
        /*cargo el registro*/
        reg.block = cant; /*no incremento cant, porque grabe el nuevo bloque antes y no lo conte!!*/
        fclose(file);
        /*cargo el registro*/
        reg.block = cant; /*no incremento cant, porque grabe el nuevo bloque antes y no lo conte!!*/