Operacions bàsiques amb arxius seqüencials
Partim del fet que l'alumne coneix conceptes com "entitat", "atribut", "domini" o "atributs clau".
Un arxiu és la representació d'una entitat. L'arxiu està format per registres, que representen les diferents instàncies de l'entitat. Cada registre té uns camps, que es corresponen amb els atributs.
Els arxius en programació normalment estan emmagatzemats en un suport extern a la memòria. Són els arxius externs. Per treballar amb ells, declarem en els nostres programes uns arxius interns, que treballen com punters als externs. Mitjançant els arxius interns podem llegir i escriure en un arxiu extern.
En pseudocodi seria:
tipus persona = tupla
codi:natural;
nom:cadena[20];
dni:cadena[10];
edat:natural;
fitupla
fitipus
var
fpers: fitxer de persona;
r: persona;
fivar
I ara les operacions es fan de la següent manera: fixeu-vos que tenim un fitxer (fpers) i una altra variable de tipus persona, amb un sol element (un registre). Bé, doncs totes les operacions es fan mitjançant aquest registre. Quan llegim un registre del fitxer ho fem passant-lo al registre r, si volem fer canvis els farem sobre r, i després enregistrem r sobre f.
Els arxius poden tenir diferents mecanismes d'accés. Principalment, poden ser seqüencials o directes, i els mètodes d'accés i les possibilitats de treball són diferents en cada cas.
Accés seqüencial: per accedir a un registre cal passar per tots els anteriors. Només es pot inserir pel final.
Accés directe: per accedir a un registre no cal passar per tots els anteriors.
Operacions amb arxius seqüencials
Declaracions:
tipus
t = tupla
........
fitupla
var
f: fitxer_seq de t;
...
fivar
Operacions: Depèn del SGF, però sovint trobarem les següents:
funció
obrir_fs(f:fitxer_seq de t, F:cadena, mode:caràcter)
retorna enter;
funció tancar_fs(f:fitxer_seq de t) retorna
enter;
funció llegir_fs(f:fitxer_seq de t, r:T)
retorna enter;
funció escriure_fs(f:fitxer_seq de t, r:T) retorna
enter;
funció modificar_fs(f:fitxer_seq de t, r:T) retorna
enter;
Fixeu-vos: l'argument f és el fitxer intern. En la funció obrir_fs l'associarem a un fitxer extern. Totes les funcions tornen un enter: és un 0 si l'execució de la funció ha estat correcta, o un valor que ens indica el tipus d'anomalia que s'ha produït.
obrir_fs (f:fitxer_seq de t, F:cadena, mode:caràcter) retorna enter
És
la funció que efectua l'enllaç entre el fitxer intern (f) i el
extern (F, cadena que ha de contenir el nom de l'arxiu extern). L'argument mode
permet definir el tipus d'obertura de l'arxiu (I : inici, E: extensió,
C: consulta, A: actualització).
tancar_fs (f:fitxer_seq de t ) retorna enter
Desfà l'enllaç entre arxiu intern i arxiu extern. Si hi ha informació pendent al buffer, és enregistrada.
llegir_fs (f:fitxer_seq de t, r: t ) retorna enter
Efectua la lectura lògica del següent registre des del buffer (si hi és, sinó farà lectura física) cap a la variable r .
escriure_fs (f:fitxer_seq de t, r: t ) retorna enter
Efectua l'escriptura lògica del registre r cap el buffer (encara que l'enregistrament físic és inmediat si no se treballa amb enregistrament diferit )
modificar_fs (f:fitxer_seq de t, r: t ) retorna enter
Efectua la modificació d'un registre existent a l'arxiu, que prèviament ha d'haver estat llegit o modificat.
Per exemple: un algorisme senzill (sense comprovació d'errors) per introduir registres en un arxiu seqüencial:
programa introduir_dades és
var
f: fitxer_seq de T;
x: enter;
r: T;
fivar
x = obrir_fs ( f, "ARXIU.DAT", 'E' );
fer
llegir_registre ( r ); //aquesta funció seria diferent en cada cas //
x = escriure_fs( f , r );mentre <condició>; // condició per acabar: valor d'un camp, pregunta a l'usuari... //
x = tancar_fs( f );
fiprograma