1 /* archivo con bloques parametrizados y registro constante */
9 /** Leo un registro del archivo, devuelve cero si no lo encuentra.**/
10 int leer_registro(int ID, void *str, unsigned long tam)
12 /* FIXME : aca tam es el tamaño del registro, no del bloque!
14 * Aca deberias recibir una estructura EMUFS y de ahi sacar los datos
15 * del tamaño del bloque a leer.
17 * leer_registro(EMUFS, int, void*, unsigned long);
19 * Tambien ver que siempre que hay un return se libere toda la memoria!
21 char* bloque = (char*)malloc(tam);
22 int block, ID_aux, a, b, c, d, tamanio_registro;
24 /* tengo que crear los archivos de indice antes de usarlos!!!!!!!!!*/
25 if ( (block_reg = fopen("block_reg.dat","a+")) == NULL )
28 if ( (block_free = fopen("block_free.dat","a+")) == NULL )
31 if ( (reg_exist = fopen("reg_exist.dat","a+")) == NULL )
33 /* si el registro no existe, retorno*/
34 if ( existe_registro(ID) == -1 ) return -1;
35 /*si existe, lo busco en el archivo de bloques*/
37 block = buscar_registro(ID); /*me devuelve el nro de bloque al que pertenece el registro*/
38 if (leer_bloque(block,bloque,tam)==-1)
39 return -1; /*No se pudo leer el bloque*/
41 while ( iterador != (tam/tamanio_registro) ){
42 a = bloque[0+iterador];
43 b = bloque[1+iterador];
44 c = bloque[2+iterador];
45 d = bloque[3+iterador];
46 ID_aux = (d << 0 ) | (c << 8) | ( b << 16) | (a << 24);
48 /* TODO : la copia es byte a byte. Al archivo
49 * no le importa que tipo de estructura es
51 //aca va el memcpy... HACER!!
55 // FIXME : El tamaño del registro es lo que debo tener
56 // aca, no el tamaño del tipo de dato.
58 // Cuando se crea el archivo se le da el tamaño de un registro
59 iterador += tamanio_registro;
70 /*busco el registro ID en el archivo reg_exist.dat, para ver si existe.*/
71 int existe_registro(int ID)
75 if ( (reg_exist = fopen("reg_exist.dat","r")) == NULL) return 0; /*ERROR*/
76 while ( !feof(reg_exist) ){
77 fscanf(reg_exist,"%i%c",&num,&ex);
78 if ( num == ID && ex == 'S' ){
89 /*busca el registro ID en el archivo "block_reg.dat" y devuelve el nro de bloque en el que se encuentra*/
90 int buscar_registro(int ID)
92 int num_block, num_reg;
93 if ( (block_reg = fopen("block_reg.dat","r")) == NULL) return 0; /*ERROR*/
94 while ( !feof(block_reg) ){
95 fscanf(block_reg,"%i%i",&num_block,&num_reg);
106 int leer_bloque(int ID, void* str, unsigned long tam)