From 8190084c46a37139904c2a0114a2d3020f48282a Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Mon, 5 Apr 2004 04:15:17 +0000 Subject: [PATCH] =?utf8?q?=20*=20Primer=20ejemplo=20de=20grabacion=20y=20r?= =?utf8?q?ecuperacion=20de=20un=20registro=20funciona=20al=20fin!=20=20*?= =?utf8?q?=20Hay=20algo=20raro=20en=20leer=5Fregistro=20que=20hace=20que?= =?utf8?q?=20el=20free=20del=20final=20cause=20un=20SEGFAULT=20=20*=20Arre?= =?utf8?q?gle=20leer=5Fbloque=20porque=20estaba=20faltando=20sumar=20el=20?= =?utf8?q?campo=20tama=C3=B1o=5Fregistro=20al=20header=20del=20archivo.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- tipo3/main.c | 5 +++-- tipo3/param_cte.c | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) 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!!*/ -- 2.43.0