* 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.
EMUFS *fp;
char a[] = "1234567890";
int n;
EMUFS *fp;
char a[] = "1234567890";
int n;
fp = emufs_crear("articulos", T3, 512, 100);
fp = emufs_crear("articulos", T3, 512, 100);
- fp->leer_registro(fp, n, b, 100);
+ fp->leer_registro(fp, n, b, 20);
printf("Recuperado : %s\n", b);
emufs_destruir(fp);
printf("Recuperado : %s\n", b);
emufs_destruir(fp);
/*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*/
/*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);
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*/
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 ){
memcpy(&ID_aux, bloque+iterador, sizeof(int));
iterador += 4;
if ( ID_aux == ID ){
- fclose(f_block_reg);
- free(bloque);
+ fclose(f_block_reg);
+ /* TODO :Ver por que causa un SEGFAULT ACA!! */
+ //free(bloque);
if (fread(®,sizeof(reg),1,f_block_reg) != 1) continue;
if ( reg.id_reg == ID ){
fclose(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);
strcat(name_f,".dat");
if ( (file = fopen(name_f,"r"))==NULL ) return -1; /*ERROR*/
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;
/*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;
}
fclose(file);
return 0;
}
/*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;
/*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!!*/
fclose(file);
/*cargo el registro*/
reg.block = cant; /*no incremento cant, porque grabe el nuevo bloque antes y no lo conte!!*/