From 3680858ed318cb5b0a2d742693766a0d5c5fc528 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Mon, 5 Apr 2004 03:54:01 +0000 Subject: [PATCH] * BUGFIX : En grabar registro calculo correctamente el numero de bloque en caso de ser un nuevo bloque. --- tipo3/main.c | 10 +++++++++- tipo3/param_cte.c | 20 +++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/tipo3/main.c b/tipo3/main.c index 4858f37..395ed53 100644 --- a/tipo3/main.c +++ b/tipo3/main.c @@ -6,10 +6,18 @@ int main() { EMUFS *fp; char a[] = "1234567890"; + int n; + char b[100]; fp = emufs_crear("articulos", T3, 512, 100); - printf("ID = %d\n", fp->grabar_registro(fp, a, strlen(a)+1)); + n = fp->grabar_registro(fp, a, strlen(a)+1); + + printf("ID = %d\n", n); + + fp->leer_registro(fp, n, b, 100); + + printf("Recuperado : %s\n", b); emufs_destruir(fp); return 0; diff --git a/tipo3/param_cte.c b/tipo3/param_cte.c index 3189a97..fbb66a4 100644 --- a/tipo3/param_cte.c +++ b/tipo3/param_cte.c @@ -22,6 +22,7 @@ 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) return -1; /*No se pudo leer el bloque*/ @@ -73,9 +74,10 @@ int buscar_registro(EMUFS *emu, int ID) if ( (f_block_reg = fopen(name_f_block_reg,"r")) == NULL) return -1; /*ERROR*/ while ( !feof(f_block_reg) ){ - fread(®,sizeof(reg),1,f_block_reg); + 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; } } @@ -135,7 +137,6 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) /* me devuelve el ID del bloque donde quepa un registro y el espacio libre en "fs"*/ num_bloque = buscar_lugar(emu, tam, &fs); /*si no hay bloques con suficiente espacio creo un bloque nuevo */ - printf("num_bloque = %d\n", num_bloque); if (num_bloque == -1) { /*crear un nuevo bloque en memoria */ bloque = (char*)malloc(emu->tam_bloque); @@ -147,7 +148,7 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) /*grabo el registro en el bloque*/ memcpy(bloque+sizeof(int),ptr,tam); /* me paro al final del archivo */ - fseek(file, 0, SEEK_END); + fseek(file, 0, SEEK_END); /* grabo el bloque en el final del archivo */ fwrite(bloque,emu->tam_bloque,1,file); } else { @@ -174,11 +175,8 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) /*actualizo el archivo de espacios libres*/ /*tengo que buscar la cantidad de bloques que existen*/ /*me paro al principio salteando el encabezado del archivo*/ - fseek(file,sizeof(int)+sizeof(char),SEEK_CUR); - while ( !feof(file) ){ - fread(bloque,emu->tam_bloque,1,file); - cant++; /*ya grabe el nuevo bloque !!!*/ - } + fseek(file, 0, SEEK_END); /* Me paro al final */ + cant = (ftell(file)-(sizeof(int)+sizeof(char))) / emu->tam_bloque; fclose(file); /*cargo el registro*/ reg.block = cant; /*no incremento cant, porque grabe el nuevo bloque antes y no lo conte!!*/ @@ -189,10 +187,10 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) fclose(f_block_free); /*actualizo el archivo de bloques y registros*/ - if ( (f_block_reg = fopen(name_f_block_reg,"a+"))==NULL ) return -1; /*ERROR*/ + if ( (f_block_reg = fopen(name_f_block_reg,"ab+"))==NULL ) return -1; /*ERROR*/ reg_b.block = reg.block; reg_b.id_reg = ID_aux; - fwrite(®_b,sizeof(reg_b),1,f_block_reg); + fwrite(®_b,sizeof(reg_b),1,f_block_reg); fclose(f_block_reg); free(bloque); @@ -281,7 +279,7 @@ int get_id(EMUFS *emu) if ( (f_block_reg = fopen(name_f_block_reg,"r")) == NULL) return -1; /*ERROR*/ while ( !feof(f_block_reg) ){ /* Me aseguro de leer la cantidad de bytes correcta */ - if (fread(®,sizeof(reg),1,f_block_reg) != sizeof(reg)) continue; + if (fread(®,sizeof(reg),1,f_block_reg) != 1) continue; if ( reg.id_reg >= max ) max = reg.id_reg; } -- 2.43.0