From: Ricardo Markiewicz Date: Mon, 5 Apr 2004 04:15:17 +0000 (+0000) Subject: * Primer ejemplo de grabacion y recuperacion de un registro funciona al fin! X-Git-Tag: svn_import_r684~646 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/8190084c46a37139904c2a0114a2d3020f48282a?ds=sidebyside * Primer ejemplo de grabacion y recuperacion de un registro funciona al fin! * 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. --- diff --git a/tipo3/main.c b/tipo3/main.c index 395ed53..0e38cc5 100644 --- a/tipo3/main.c +++ b/tipo3/main.c @@ -7,7 +7,7 @@ int main() EMUFS *fp; char a[] = "1234567890"; int n; - char b[100]; + char b[101]; fp = emufs_crear("articulos", T3, 512, 100); @@ -15,8 +15,9 @@ int main() 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); diff --git a/tipo3/param_cte.c b/tipo3/param_cte.c index fbb66a4..0ee3d7f 100644 --- a/tipo3/param_cte.c +++ b/tipo3/param_cte.c @@ -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*/ - printf("block %d\n", block); 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*/ + } - while ( iterador != emu->tam_bloque ){ + while ( iterador < emu->tam_bloque ){ 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; } - fclose(f_block_reg); - free(bloque); + fclose(f_block_reg); + /* TODO :Ver por que causa un SEGFAULT ACA!! */ + //free(bloque); return 0; } @@ -77,7 +79,6 @@ int buscar_registro(EMUFS *emu, int ID) if (fread(®,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; } } @@ -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*/ - 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; - + 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; + 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!!*/