From cea6c333334aa778c0828c62821f4fafc099ea8c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicol=C3=A1s=20Dimov?= Date: Tue, 6 Apr 2004 21:39:12 +0000 Subject: [PATCH] Implemento borrar_registro, pero me falta actualizar el archivo de bloques/registros, tengo dudas de como hacerlo --- tipo3/emufs.c | 4 +-- tipo3/emufs.h | 3 +- tipo3/main.c | 5 ++- tipo3/param_cte.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++ tipo3/param_cte.h | 18 ++++++----- 5 files changed, 96 insertions(+), 13 deletions(-) diff --git a/tipo3/emufs.c b/tipo3/emufs.c index 35563fa..53ba505 100644 --- a/tipo3/emufs.c +++ b/tipo3/emufs.c @@ -36,7 +36,7 @@ EMUFS *emufs_crear(const char *filename, char tipo, unsigned int tam_bloque, uns tmp->leer_bloque = leer_bloque; tmp->leer_registro = leer_registro; tmp->grabar_registro = grabar_registro; - tmp->borrar_registro = NULL; + tmp->borrar_registro = borrar_registro; tmp->nombre = str_dup(filename); strcpy(name, filename); @@ -114,7 +114,7 @@ EMUFS *emufs_abrir(const char *filename) tmp->leer_bloque = leer_bloque; tmp->leer_registro = leer_registro; tmp->grabar_registro = grabar_registro; - tmp->borrar_registro = NULL; + tmp->borrar_registro = borrar_registro; tmp->nombre = str_dup(filename); } diff --git a/tipo3/emufs.h b/tipo3/emufs.h index 89731c9..81d62b3 100644 --- a/tipo3/emufs.h +++ b/tipo3/emufs.h @@ -35,7 +35,7 @@ typedef struct _emu_fs_t { int (*leer_bloque)(struct _emu_fs_t *, int, void *); /**< Método para leer un bloque */ int (*leer_registro)(struct _emu_fs_t *, int, void *, unsigned long); /**< Método para leer un registro */ int (*grabar_registro)(struct _emu_fs_t *, void *, unsigned long ); /**< Método para grabar un registro */ - int (*borrar_registro)(struct _emu_fs_t *, int); /**< Método para borrar un registro */ + int (*borrar_registro)(struct _emu_fs_t *, int, int); /**< Método para borrar un registro */ char *nombre; /**< Nombre del archivo */ } EMUFS; @@ -77,4 +77,3 @@ int emufs_destruir(EMUFS *e); int ver_archivo_FS(EMUFS *emu); #endif - diff --git a/tipo3/main.c b/tipo3/main.c index b403de0..0df4f32 100644 --- a/tipo3/main.c +++ b/tipo3/main.c @@ -52,11 +52,14 @@ int main(int argc, char *argv[]) printf("ID5 = %d\n", n6); printf("ID6 = %d\n", n7); - fp->leer_registro(fp, n1, b, 100); + fp->leer_registro(fp, n4, b, 100); printf("Recuperado : %s\n", b); + fp->borrar_registro(fp, n4, 100); + ver_archivo_FS(fp); + emufs_destruir(fp); return 0; diff --git a/tipo3/param_cte.c b/tipo3/param_cte.c index 0b2cc83..66be7e8 100644 --- a/tipo3/param_cte.c +++ b/tipo3/param_cte.c @@ -319,3 +319,82 @@ int get_id(EMUFS *emu) fclose(f_reg_exist); return id; } + +/*borra un registro de un bloque y acomoda los registros que quedan*/ +int borrar_registro(EMUFS *emu, int ID, int tam_reg) +{ + int num_bloque, ptr_elim, ptr_mov, ID_aux; + char *bloque; + FILE *f_reg_exist, *f_block_reg, *f_block_free; + BLOCK_REG_T reg_b; + BLOCK_FREE_T reg_f; + char name_f_reg_exist[255]; + char name_f_block_reg[255]; + char name_f_block_free[255]; + + strcpy(name_f_block_reg,emu->nombre); + strcat(name_f_block_reg,".idx"); + + strcpy(name_f_reg_exist,emu->nombre); + strcat(name_f_reg_exist,".did"); + + strcpy(name_f_block_free,emu->nombre); + strcat(name_f_block_free,".fsc"); + + num_bloque = buscar_registro(emu, ID); + bloque = (char*)malloc(emu->tam_bloque); + if ( leer_bloque(emu,num_bloque, bloque) == -1 ){ + printf("No se encontro el bloque\n"); + return -1; + } + + /*apunto al registro que voy a eliminar*/ + ptr_elim = 0; + while ( ptr_elim < emu->tam_bloque ){ + memcpy(&ID_aux, bloque+ptr_elim, sizeof(int)); + if ( ID_aux == ID ) + break; + ptr_elim += tam_reg + sizeof(int); + } + + /*apunto al registro que voy a mover*/ + ptr_mov = ptr_elim + tam_reg + sizeof(int); + + while ( ptr_mov < emu->tam_bloque ){ + memcpy(bloque+ptr_elim, bloque+ptr_mov, sizeof(int)+tam_reg); + ptr_elim = ptr_mov; + ptr_mov += sizeof(int) + tam_reg; + } + + /*grabo el bloque en el archivo*/ + if ( grabar_bloque(emu, bloque, num_bloque) == -1 ){ + printf("No se pudo grabar el bloque\n"); + return -1; + } + + /*actualizo archivo .fsc*/ + if ( (f_block_free = fopen(name_f_block_free,"r+")) == NULL ) return -1; + while ( !feof(f_block_free) ){ + fread(®_f,sizeof(BLOCK_FREE_T),1,f_block_free); + if ( reg_f.block == num_bloque ){ + reg_f.free_space += tam_reg - sizeof(int); + fseek(f_block_free,-sizeof(BLOCK_FREE_T),SEEK_CUR); + fwrite(®_f,sizeof(BLOCK_FREE_T),1,f_block_free); + } + } + fclose(f_block_free); + + /*actualizo archivo .did*/ + if ( (f_reg_exist = fopen(name_f_reg_exist,"a+")) == NULL) return -1; + fwrite(&ID, sizeof(int), 1, f_reg_exist); + fclose(f_reg_exist); + + + /*actualizo archivo .idx*/ + + + + free(bloque); + +return 0; +} diff --git a/tipo3/param_cte.h b/tipo3/param_cte.h index da64001..47b2568 100644 --- a/tipo3/param_cte.h +++ b/tipo3/param_cte.h @@ -16,19 +16,21 @@ typedef struct block_reg_t{ long int id_reg; }BLOCK_REG_T; -int leer_registro(EMUFS *emu, int ID, void *, unsigned long tam); +int leer_registro(EMUFS *, int , void *, unsigned long); -int leer_bloque(EMUFS *emu, int ID, void *); +int leer_bloque(EMUFS *, int , void *); -int grabar_registro(EMUFS *emu, void *, unsigned long tam); +int grabar_registro(EMUFS *, void *, unsigned long ); -int existe_registro(EMUFS *emu, int ID); +int existe_registro(EMUFS *, int); -int buscar_registro(EMUFS *emu, int ID); +int buscar_registro(EMUFS *, int); -int buscar_lugar(EMUFS *emu, unsigned long tam, int *fs); +int buscar_lugar(EMUFS *, unsigned long , int *); -int get_id(EMUFS *emu); +int get_id(EMUFS *); -int grabar_bloque(EMUFS *emu, void *ptr, int num); +int grabar_bloque(EMUFS *, void *, int); + +int borrar_registro(EMUFS*, int, int); #endif -- 2.43.0