From 195807904dee0a8ab038e233a4447aae455dfc46 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicol=C3=A1s=20Dimov?= Date: Mon, 5 Apr 2004 19:16:29 +0000 Subject: [PATCH] -El archivo de espacios libres se estaba cargando mal. Ahora creo que se carga bien. Igual cuando leo un registro me tira basura, y no estoy seguro si los esta guardando bien, creo que se pisan.. --- tipo3/emufs.c | 22 +++++++++++++++ tipo3/emufs.h | 2 ++ tipo3/main.c | 31 +++++++++++++++++---- tipo3/param_cte.c | 69 ++++++++++++++++++++++++++++++----------------- 4 files changed, 94 insertions(+), 30 deletions(-) diff --git a/tipo3/emufs.c b/tipo3/emufs.c index a769741..e696d86 100644 --- a/tipo3/emufs.c +++ b/tipo3/emufs.c @@ -128,3 +128,25 @@ int emufs_destruir(EMUFS *e) return 0; } +int ver_archivo_FS(EMUFS *emu) +{ + FILE *f_block_free; + BLOCK_FREE_T reg; + char name_f_block_free[255]; + + strcpy(name_f_block_free,emu->nombre); + strcat(name_f_block_free,".fsc"); + + if ( (f_block_free = fopen("articulos.fsc","r"))==NULL ){ + printf("no pude abrir el archivo %s\n",name_f_block_free); + return -1; + } + + while ( !feof(f_block_free) ){ + fread(®,sizeof(reg),1,f_block_free); + printf(" Bloque = %d Espacio libre = %d\n",reg.block, reg.free_space); + } + + fclose(f_block_free); + return 0; +} diff --git a/tipo3/emufs.h b/tipo3/emufs.h index 2cbc027..3772127 100644 --- a/tipo3/emufs.h +++ b/tipo3/emufs.h @@ -20,4 +20,6 @@ EMUFS *emufs_crear(const char *filename, char tipo, unsigned int tam_bloque, uns EMUFS *emufs_abrir(const char *filename); int emufs_destruir(EMUFS *e); + +int ver_archivo_FS(EMUFS *emu); #endif diff --git a/tipo3/main.c b/tipo3/main.c index 5550d0c..b0da352 100644 --- a/tipo3/main.c +++ b/tipo3/main.c @@ -7,26 +7,47 @@ int main() EMUFS *fp; char a[100]; char c[100]; - int n1, n2; + int n1, n2, n3, n4, n5, n6, n7; char b[100]; - + char d[100]; + char e[100]; + char f[100]; + char g[100]; + char h[100]; + strcpy(a, "1234567890"); strcpy(c, "REGISTRO NUMERO 2. ESTE REGISTRO ES MUCHO MAS LARGO QUE EL UNO"); - + strcpy(d, "ABCDEFGHIJKL"); + strcpy(e, "HOLA soy un registro nuevo, me llamo E"); + strcpy(f, "yo soy F"); + strcpy(g, "me llamo G y quiero estar en el bloque 1"); + strcpy(h, "un registro nuevo que se llama H, acompania a G en el bloque 1"); + + fp = emufs_crear("articulos", T3, 512, 100); n1 = fp->grabar_registro(fp, a, 100); n2 = fp->grabar_registro(fp, c, 100); + n3 = fp->grabar_registro(fp, d, 100); + n4 = fp->grabar_registro(fp, e, 100); + n5 = fp->grabar_registro(fp, f, 100); + n6 = fp->grabar_registro(fp, g, 100); + n7 = fp->grabar_registro(fp, h, 100); printf("ID1 = %d\n", n1); printf("ID2 = %d\n", n2); + printf("ID3 = %d\n", n3); + printf("ID4 = %d\n", n4); + printf("ID5 = %d\n", n5); + printf("ID6 = %d\n", n6); + printf("ID7 = %d\n", n7); - fp->leer_registro(fp, n1, b, 100); + fp->leer_registro(fp, n5, b, 100); printf("Ok\n"); printf("Recuperado : %s\n", b); emufs_destruir(fp); - + ver_archivo_FS(fp); return 0; } diff --git a/tipo3/param_cte.c b/tipo3/param_cte.c index d7d0d24..3358cd1 100644 --- a/tipo3/param_cte.c +++ b/tipo3/param_cte.c @@ -15,18 +15,20 @@ int leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg) strcpy(name_f_block_reg,emu->nombre); strcat(name_f_block_reg,".id3"); - /* tengo que crear los archivos de indice antes de usarlos!!!!!!!!!*/ + if ( (f_block_reg = fopen(name_f_block_reg,"a+")) == NULL ) return -1; /*ERROR*/ /*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("buscar registro, bloque = %d\n", block); bloque = (char*)malloc(emu->tam_bloque); if (bloque == NULL) { printf("No hay memoria.\n"); return -1; } + if (leer_bloque(emu, block, bloque)==-1) { free(bloque); return -1; /*No se pudo leer el bloque*/ @@ -34,6 +36,7 @@ int leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg) while ( iterador < emu->tam_bloque ){ memcpy(&ID_aux, bloque+iterador, sizeof(int)); + /*printf("ID_au = %d\n",ID_aux);*/ iterador += sizeof(int); if ( ID_aux == ID ){ memcpy(ptr,bloque+iterador,tam_reg); @@ -41,7 +44,8 @@ int leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg) } iterador += tam_reg; } - + /*printf("reg leido = %s\n",(char*)ptr);*/ + fclose(f_block_reg); free(bloque); return 0; @@ -155,9 +159,26 @@ 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); + + /*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, 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!!*/ + /* GAZER */ + /*printf("FS = %d\n", fs);*/ + reg.free_space = fs-tam; + /*lo guardo en el archivo al final "a+"*/ + if ( (f_block_free = fopen(name_f_free,"a+"))==NULL ) return -1; /*ERROR*/ + fwrite(®,sizeof(reg),1,f_block_free); + fclose(f_block_free); } else { /*cargo el bloque en "bloque"*/ bloque = (char*)malloc(emu->tam_bloque); @@ -172,6 +193,21 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) memcpy(bloque+emu->tam_bloque-fs+sizeof(int),ptr,tam); /*guardo el bloque en el archivo*/ if ( grabar_bloque(emu, bloque, num_bloque) != 0) return -1; /* se produjo un error */ + + /*actualizo el archivo de espacios libres*/ + /*busco el bloque que modifique*/ + if ( (f_block_free = fopen(name_f_free,"r+")) == NULL) return -1; /*ERROR*/ + while ( !feof(f_block_free) ){ + fread(®,sizeof(reg),1,f_block_free); + if ( reg.block == num_bloque ){ + reg.free_space -= tam; + /*me parece que tengo que retroceder una posicion*/ + fseek(f_block_free,-sizeof(reg),SEEK_CUR); + fwrite(®,sizeof(reg),1,f_block_free); + break; + } + } + fclose(f_block_free); } /*actualizo el archivo de id`s*/ @@ -179,30 +215,13 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) fwrite(&ID_aux,sizeof(ID_aux),1,f_id); fclose(f_id); - /*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, 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!!*/ - /* GAZER */ - printf("FS = %d\n", fs); - reg.free_space = fs-tam; - /*lo guardo en el archivo al final "a+"*/ - if ( (f_block_free = fopen(name_f_free,"a+"))==NULL ) return -1; /*ERROR*/ - fwrite(®,sizeof(reg),1,f_block_free); - fclose(f_block_free); - /*actualizo el archivo de bloques y registros*/ 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); fclose(f_block_reg); - + free(bloque); return ID_aux; } @@ -231,12 +250,12 @@ int buscar_lugar(EMUFS *emu, unsigned long tam, int *fs) { FILE *f_block_free; BLOCK_FREE_T reg; - char name_f_block_reg[255]; + char name_f_block_free[255]; - strcpy(name_f_block_reg,emu->nombre); - strcat(name_f_block_reg,".fsc"); + strcpy(name_f_block_free,emu->nombre); + strcat(name_f_block_free,".fsc"); - if ( (f_block_free = fopen(name_f_block_reg,"r"))==NULL ) return -1; + if ( (f_block_free = fopen(name_f_block_free,"r"))==NULL ) return -1; /* Inicializo la estructura para evitar que si el archivo esta vacio * el resultado sea correcto -- 2.43.0