Está en la página 1de 50

Archivos

CAPITULO 14
ARCHIVOS
Introduccin
En el captulo anterior vimos cmo organizar la informacin relativa a una
biblioteca en arreglos de estructuras o bien en arreglos paralelos. Todas las
estructuras de datos vistas hasta ahora, arreglos de una o ms dimensiones y
variavles de estructuras, se almacenan en memoria RA. !omo esta memoria es
voltil, cuando se apaga la computadora toda la informacin almacenada en ella se
borra y por consiguiente tendramos cada vez volver a ingresar toda la
informacin. Esto en impensable en situaciones reales, por e"emplo una biblioteca
#ue contenga $%%%%% libros en lugar de &%. 'ara evitar esto utilizaremos medios de
almacenamiento secundario( las cintas magn)ticas, los discos rgidos, los discos
fle*ibles y los discos de almacenamiento ptico son e"emplos de medios de
almacenamiento secundario.
El almacenamiento secundario tiene varias venta"as con respecto a la
memoria RA( no re#uieren el suministro continuo de energa el)ctrica para
conservar la informacin+ se puede almacenar ms informacin en estos medios de
la #ue normalmente puede almacenarse en RA y es ms econmica. Tales
venta"as no se logran sin dar algo a cambio( el acceso a la informacin del
almacenamiento secundario es mucho ms lento #ue el acceso a memoria RA.
!omo puede verse guardar la informacin en un disco u otra forma de
almacenamiento secundario tiene sus venta"as y desventa"as, por ello la decisin
de #u) se guarda y #u) no en disco debe hacerse cuidadosamente.
$
Archivos
Concepto Y Clasificacin e Arc!i"os
,a informacin #ue se guarda en almacenamiento secundario se estructura
en archivos o ficheros. !omo los arreglos, los archivos son homogneos( slo
pueden contener un tipo de valores de datos. ,os elementos de un archivo pueden
ser de cual#uier tipo e*cepto uno #ue contenga un archivo.
E*isten distintas clasificaciones de archivos. -na primera clasificacin
consiste en definir archivos de texto y binarios. ,os primeros son archivos de
caracteres, divididos en lneas de te*to como los de una pgina impresa. Estos
archivos tienen la venta"a #ue pueden verse en pantalla con los comandos #ue el
sistema operativo tenga para tal fin .type en /01, cat en -234, 5loc6 de 2otas en
732/0718 o bien editarlos con cual#uier procesador de te*to. ,a gran
desventa"a de estos archivos es #ue la escritura y lectura con los programas en ! o
cual#uier otro lengua"e es muy lenta pues deben traducir la informacin en
memoria, #ue est en binario, a caracteres y viceversa. En los archivos binarios la
informacin se representa con los mismos patrones de bits empleados para
representarla en la memoria principal y por lo tanto no se re#uiere una traduccin
al leer o escribir. ,a informacin de los archivos binarios se agrupa, lgicamente,
en registros, entonces podemos definir a un archivo como una coleccin de
registros lgicamente relacionados. !omo puede observarse esta definicin no
difiere del concepto #ue tenamos de arreglos de estructuras o arreglos paralelos.
El tama9o de los archivos no se fi"a a priori como en los arreglos. -n archivo es
una estructura dinmica #ue aumenta su tama9o o lo disminuye a medida #ue se
e"ecuta el programa+ el lmite lo fi"a la capacidad del almacenamiento secundario
.disco, cinta, etc.8. Adems un archivo puede ser utilizado por distintos programas,
por e"emplo un programa carga informacin en )l y otro la muestra por pantalla.
El concepto de archivo no debe limitarse slo al almacenamiento en discos o
cintas. Tambi)n son archivos la salida impresa o la entrada de datos a trav)s de un
lote de tar"etas perforadas. 1i bien esto :ltimo hoy ha cado en desuso es un buen
e"emplo de un archivo de entrada #ue no est en disco.
0tra clasificacin de los archivos es( archivos de E/S .entrada;salida8,
archivo slo de entrada y archivos slo de salida. Archivos slo de salida .la
informacin se transfiere de la memoria al medio e*terno8 son la impresiones en
papel+ archivos slo de entrada .la informacin se transfiere del medio e*terno a la
memoria8 son los lotes de tar"etas perforadas y finalmente los de E;1 .la
informacin se transfiere desde el medio e*terno a la memoria o desde la memoria
al medio e*terno8 son a#uellos #ue pueden leerse y escribirse.
-na tercera clasificacin est dada por la forma en #ue puede accederse a la
informacin de un archivo( acceso secuencial, acceso directo o secuencial con
ndice. En un archivo secuencial para acceder a un registro debemos pasar por
todos los anteriores a )l .como la b:s#ueda secuencial en un arreglo8. Todos los
dispositivos de memoria e*terna soportan este tipo de acceso pero otros, por su
naturaleza fsica, es el :nico #ue soportan. !intas magn)ticas, lectoras de tar"etas
perforadas y las impresoras de lnea son e"emplos de almacenamiento e*terno #ue
&
Archivos
slo soportan archivos de acceso secuencial. En los archivos de acceso directo se
puede acceder a cual#uier registro sin necesidad de tener #ue acceder a los
anteriores .de la misma manera #ue se accede a un elemento de un arreglo8.
'odemos leer la informacin contenida en el vig)simo registro sin necesidad de
leer los diecinueve anteriores. ,os discos es el medio e*terno para almacenar estos
archivos. <inalmente los archivos secuencial con ndice slo son soportados por
algunos lengua"es .!050, y los mane"adores de bases de datos8. !onsideremos
#ue cada registro de un archivo contiene la informacin relativa a un alumno de la
-niversidad .matrcula, nombre, calificacin de primer e*amen parcial,
calificacin del segundo e*amen y nota de concepto8. -n dato de un registro, #ue
identifica unvocamente a )ste se denomina clave. ,a matrcula sirve de clave para
este archivo. En una organizacin secuencial con ndice los registros se encuentran
en posiciones consecutivas pero adems e*isten tablas de ndices esto es tablas #ue
contienen la clave y el n:mero de registro donde se encuentra la informacin
correspondiente al valor de la clave.
En este captulo trataremos, en primer lugar los archivos de te*to, luego los
archivos binarios y al final del mismo veremos algunas t)cnicas sencillas para
construir archivos ndices.
Arc!i"os e Te#to
-n archivo de te*to consiste de varias lneas, cada una de las cuales consta
de un n:mero variable de caracteres. El concepto es similar a una pgina escrita.
El archivo puede leerse o escribirse ya sea lnea por lnea o carcter por carcter.
'odemos decir #ue la lectura de un archivo de te*to es similar a introducir
informacin va un teclado y #ue la escritura de un archivo de te*to es seme"ante a
la salida en una pantalla o impresora.
Antes de utilizar un archivo debemos activarlo .abrir el archivo8, despu)s
podemos ya sea leer informacin desde el archivo o escribir en )l+ por :ltimo
cuando terminamos debemos desactivarlo .cerrar el archivo8.
En C, para utilizar un archivo debemos, en primer lugar, definir un tipo de
variable especial #ue se la conoce como puntero a archivo. -n puntero a archivo
es una variable #ue se9ala a la informacin #ue define varias cosas propias del
archivo, entre las #ue se incluye su nombre, su estado y la posicin actual. ,a
sint*is para definir una varable puntero a archivo es(
FILE *nombre_de_archivo;
donde nombre_de_archivo se construye de la misma manera #ue los nombres de
variables. ,a siguiente sentencia define a arch como un puntero a archivo .
FILE *arch;
=
Archivos
Apertura e Un Arc!i"o
'ara abrir un archivo se utiliza la funcin fopen() .f( file, archivo en ingl)s+
open( abrir8. Esta funcin sirve para asociar la variable puntero a archivo, #ue
llamaremos archivo lgico, con un archivo en disco u otro medio e*terno, #ue
llamaremos archivo fsico. Adems informa el tipo de archivo y el modo de
apertura. El prototipo de fopen() es(
FILE *fopen(char nombrearchivo[], char modo[]);
donde nombrearchivo[] es una cadena de caracteres, constante o variable, #ue
formen un nombre archivo vlido para el sistema operativo, y puede incluir la
especificacin de una va de acceso y modo es una cadena #ue indica el tipo de
archivo .de te*to o binario8 y si el archivo se va a usar slo de lectura, slo de
escritura o para ambas cosas. El valor de retorno de fopen() es un puntero a
archivo. 1i tiene lugar un error cuando se intenta abrir el archivo, fopen() retorna
el valor NULL .un puntero nulo8.
1i #uisi)ramos leer desde un archivo de nombre >mensa"e.t*t? localizado en
el mismo directorio #ue el programa, escribimos(
arch = fopen(mensaje.dat, rt);
donde >rt? indica #ue >mensa"e.t*t? se va abrir como un archivo de te*to slo de
lectura .r( reading, lectura en ingl)s y t(text8.
1i #ueremos asociar a la variable puntero a archivo fp a un archivo de
nombre >ventas.dat? #ue est en el directorio >prueba? de un disco fle*ible,
escribimos(
fp = fopen(A:\pre!a\"entas.dat, rt);
El siguiente programa define, en primer lugar, una variable puntero a archivo
de nombre p y luego asocia este puntero con un archivo de te*to de nombre
>prueba.t*t?. 1i el archivo no e*iste ocurrir un error y fopen() retorna 2-,,.
#$nc%de &std$o.h'
#$nc%de &con$o.h'
ma$n()
( FILE *p;
p = fopen()pre!a.t*t),)rt));
$f (p == +,LL)
pr$ntf()E% arch$"o no e*$ste));
e%se
pr$ntf()E% arch$"o e*$ste));
-
@
Archivos
1i el valor de modo es >At?, fopen() crea un archivo de te*to para escritura
.A( writing, escritura en ingl)s8. En este caso ocurre un error si el disco est lleno
o protegido contra escritua. ,a siguiente sentencia crea un archivo de nombre
>info.t*t? y lo asocia a la variable arch.
arch = fopen($nfo.t*t, .t);
!uando se abre un archivo para escribir pueden ocurrir dos cosas(
1i el archivo no e*iste entonces fopen() lo crea.
1i el archivo e*iste entonces fopen() lo borra y crea uno nuevo.
$%ercicios
Escribir un programa para crear un archivo de nombre >comison.dat?. E"ecutar el
programa y verificar si el archivo ha sido creado. B!untos bytes tieneC
Derificar si un archivo e*iste, sino crearlo. Emitir mensa"es aclaratorios.
$scritura e Un Car&cter
,a funcin fpuc() .f( file+ put( poner+ c( carcter8 se uitliza para escribir
caracteres en un archivo #ue haya sido abierto anteriormente para escribir
mediante la funcin fopen(). El prototipo es(
in fpuc(in car, FILE *arch);
donde car es el carcter #ue se #uiere escribir y arch es una variable puntero a
archivo.
'or razones histricas se llama formalmente int al car, pero slo se utiliza el
byte menos signifactivo.
Cierre e Un Arc!i"o
,a funcin fc!o"e() .f( file+ close( cerrar8 se emplea para cerrar toda
vinculacin entre la variable de tipo archivo y el archivo propiamente dicho.
Escribe todos los datos #ue pudieran #uedar en la memoria intermedia de disco en
el archivo .buffers8 y hace un cierre formal a nivel de sistema operativo en ese
archivo. 2o cerrar un archivo es arriesgarse a problemas de todo tipo, entre los #ue
se pueden incluir la p)rdida de datos y archivos destruidos. 'or otro lado ya debe
resultar conocido el hecho de #ue el sistema operativo limita el n:mero de
archivos #ue pueden estar abiertos al mismo tiempo, as #ue #uiz resulte
necesario cerrar un archivo antes de abrir otro. 1u prototipo es(
E
Archivos
in fc!o"e(FILE *arch);
1i fc!o"e() retorna un valor cero indicar #ue la operacin de cierre ha tenido
)*ito+ cual#uier otro valor indica un error.
El siguiente programa crea un archivo y escribe en )l una cadena #ue se
ingresa por teclado.
#$nc%de &std$o.h'
#$nc%de &con$o.h'
#$nc%de &str$n/.h'
ma$n()
( FILE * f;
$nt $;
char mensaje0123;
f = fopen()mensaje.t*t),).t));
c%rscr();
pr$ntf()In/resar n mensaje: ));
/ets(mensaje);
$ = 2;
.h$%e (mensaje0$3)
( fptc(mensaje0$3,f);
$44;
-
fc%ose(f);
-
$%ercicios
Editar una programa #ue escriba >Fola undo? en un archivo. ,uego abra el
archivo con un editor de te*to para verificar #ue el programa e"ecut
correctamente.
Escribir un prorama #ue solicite al usuario el nombre de un archivo. ,uego el
programa debe leer caracteres por teclado y escribirlos en el archivo hasta #ue se
pulse el signo G.
Lectura e Un Car&cter Y La 'uncion eof()
,a funcin f#ec() .get( obtiene+ c( carcter8 se emplea para leer caracteres
desde un archivo #ue haya sido abierto anteriormente para lectura mediante la
funcin fopen(). El prototipo es(
H
Archivos
in f#ec(FILE *arch);
donde arch es una variable puntero a archivo.
,a funcin f#ec() proporciona una marca de E$F .end of file( fin de
archivo8 cuando se haya alcanzado el fin del archivo. Tambi)n puede usarse la
funcin de biblioteca feof() para detectar el fin del archivo. Esta funcin
proporciona el valor $ .verdadero8 si se ha alcanzado el fin del archivo+ en caso
contrario, devuelve el valor cero. El prototipo de feof() es(
in feof(FILE *arch);
El siguiente progrma lee caracteres desde un archvo y los muestra por
pantalla
#$nc%de &std$o.h'
#$nc%de &con$o.h'
#$nc%de &str$n/.h'
ma$n()
( FILE * f;
char car;
f = fopen()mensaje.t*t),)rt));
c%rscr();
.h$%e(5feof(f))
( car = f/etc(f);
pr$ntf()6c), car);
-
/etch();
fc%ose(f);
-
Lectura Y $scritura e Cadenas
En lugar de leer o escribir carcter por carcter, podemos leer o escribir
cadenas de caracteres. ,as funciones f#e"() y fpu"() hacen esas opearaciones.,os
prototipos son(
char *f#e"(char cad[], in !on#iud, FILE *arch);
char *fpu"(char cad[], FILE *arch);
,a funcin f#e"() lee una cadena del archivo asociado a arch hasta #ue o
bien se lee un carcter nuevalnea o bien se han ledo longitud- caracteres. ,a
funcin fpu"() escribe la cadena cad en el archivo #ue est asociado a arch.
I
Archivos
Una Aplicacin e Arc!i"os e Te#to
Damos a escribir un programa para encriptar y desencriptar un archivo de
te*to. -saremos un algoritmo muy simple #ue ya lo usaba Julio !esar hace &%%%
a9os. 'ara encriptar el usuario elige un n:mero entre $ y &E #ue indica el
corrimiento a ser aplicado a cada letra del te*to. 'or e"emplo, si el n:mero es =,
reemplazaremos la A por /, la 5 por E y as se sigue como se ve en el siguiente
dibu"o(
A 5 ! / E < K F 3 J L , 2 0 ' M R 1 T - 7 4 N O

/ E < K F F3 J L , 2 0 ' M R 1 T - 7 4 N O A 5 !
,as letras min:sculas las transforamemos a may:sculas y odos los caracteres #ue
no son letras no se corren.
Facerlo
E"ercicio
Escribir un programa para descriptar un archivo #ue ha sido encriptado con el
programa anterior.
Un Arc!i"o Co*o Secuencia e +,tes
1upongamos #ue #uisi)ramos construir un archivo con nombres y
direcciones. El siguiente programa recibe nombres y direcciones del teclado, y los
transcribe como una secuencia de caracteres a un archivo.
#$nc%de &std$o.h'
#$nc%de &con$o.h'
#$nc%de &str$n/.h'
"o$d %eerape%%$do (char a03);
"o$d %eerdatos(char n03, char c03, char %03, char p03, char cp03);
"o$d /ra!ar(char a03, char n03, char c03, char %03, char p03, char
cp03, FILE *s);
ma$n()
( FILE * sa%$da;
$nt $;
char ape%%$do0723, nom!re0723, ca%%e8nro0923;
char %oca%$dad0723, pro"$nc$a07:3, codposta%0:3;
sa%$da = fopen()datos.t*t),).t));
%eerape%%$do (ape%%$do);
.h$%e (str%en(ape%%$do) ' 2)
( %eerdatos(nom!re, ca%%e8nro, %oca%$dad, pro"$nc$a,
codposta%);
P
Archivos
/ra!ar(ape%%$do, nom!re, ca%%e8nro, %oca%$dad, pro"$nc$a,
codposta%, sa%$da);
%eerape%%$do(ape%%$do);
-
fc%ose(sa%$da);
-
"o$d %eerape%%$do (char a03)
( c%rscr();
pr$ntf()Ape%%$do: ));
/oto*8(7;,7);
/ets(a);
-
"o$d %eerdatos(char n03, char c03, char %03, char p03, char cp03)
( pr$ntf()\n+om!re: ));
pr$ntf()\n\n<a%%e 8 +ro.: ));
pr$ntf()\n\nLoca%$dad: ));
pr$ntf()\n\n=ro"$nc$a: ));
pr$ntf()\n\n<od$/o =osta%: ));
/oto*8(7;, >);
/ets(n);
/oto*8(7;,:);
/ets(c);
/oto*8(7;,?);
/ets(%);
/oto*8(7;,@);
/ets(p);
/oto*8(7;,77);
/ets(cp);
-
"o$d /ra!ar(char a03,char n03, char c03, char %03, char p03, char
cp03, FILE *s)
( fpts(a, s);
fpts(n, s);
fpts(c, s);
fpts(%, s);
fpts(p, s);
fpts(cp, s);
-
1i se usan los siguientes nombre y direcciones como entrada,
1anchez Juan
1armiento $&=@
0livos
5uenos Aires
$H=H
artinez 0scar
3talia &=@E
<lorida
5uenos Aires
$H=E
Q
Archivos
!uando se lista el archico >datos.t*t? en la pantalla, se ve lo siguiente(
AancheBCanAarm$ento 79>DE%$"osFenos A$res7;>;Gart$neBEscarIta%$a
9>D:F%or$daFenos A$res7;>:
El programa transcribe la informacin al archivo tal como se especific(
como una secuencia de bytes #ue no contiene informacin adicional. 2o sabemos
donde termina el primer apellido o donde comienza los datos de la segunda
persona. -na vez #ue se pone toda la informacin "unta como una secuencia de
bytes, no hay forma de separarla de nuevo.
,o #ue sucede es #ue se ha perdido la integridad de las unidades
organizacionales fundamentales de los datos de entrada+ estas unidades
fundamentales no son los caracteres individuales, sino los agregados significativos
de caracteres, tales como >1anchez? o >3talia &=@E?. !uando se traba"a con
archivos, se denomina campos a esos agregados fundamentales. -n campo es la
unidad de informacin lgicamente significativa ms pe#ue9a de un archivo.
-n campo es una idea lgica, una herramienta conceptual. -n campo no
necesariamente e*iste en alg:n sentido fsico, pero aun as es importante para la
estructura del archivo. !uando la informacin sobre el nombre y la direccin se
transcribe como una secuencia de bytes no diferenciables, se pierde el rastro de los
campos #ue le dan significado a la informacin. Es necesario organizar el archivo
de manera #ue la informacin se mantenga dividida en campos.
,os siete primeros campos del e"emplo constituyen un con"unto asociado
con alguien llamado Juan 1anchez y los siguinetes siete son un con"unto asociado
con 0scar artinez, A estos con"untos de campos se les llama registros.
Al igual #ue la nocin de campo, un registro es otra herramienta conceptual.
Es otro nivel de organizacin #ue se impone sobre los datos para preservar su
significado. ,os registros no e*isten en el archivo en un sentido fsico sino #ue
constituyen una nocin lgica.
$%
Archivos
Fay varios m)todos para organizar un archivo en registros y, a su vez, )stos
en campos. -no de estos m)todos es hacer tanto a los campos como a los registros
de longitud fi"a.
-n archivo organizado en registros puede ser de te*to o binario, pero en
general se prefieren los archivos binarios. Esto es as por#ue el procesamiento de
los archivos de te*to es mucho ms lento #ue los binarios.
Representacin e Un Arc!i"o e Re-istros
1upongamos #ue una empresa tiene la siguiente informacin sobre sus
empleados( edad, se*o, departamento y categora. ,a informacin de todos los
empleados constituyen el archivo+ la informacin relativa a cada empleado es un
registro y finalmente edad, se*o, departemaento y catagoria son los campos #ue
forman un registro.
El siguiente es#uema representa este archivo. ,a primer fila contiene los
nombres de los campos, la primer columna el n:mero de registro y con ;R
indicamos el fin del archivo.
E/A
/
1E4
0
/E'ARTEE2T0 !ATEK0RSA
registro
!
=% < H A
registro

&E P 5
registro
"
@% & A
. . . .
. . . .
;R
Este es#uema es slo una representacin lgica del archivo. El archivo es
simplemente una secuencia de bytes. <sicamente este archivo es(
%%%%%%%%%%%$$$%$%%%$$%%%%%%%%%%%%%%$$%%$%%%%$........
,os primeros $H bits representan al n:mero =%, los siguiente P a la letra A,
los pr*imos $H al n:mero H, a as sucesivamente.
$$
Archivos
Operaciones Con Arc!i"os e Re-istros
As como los archivos de te*to son similares a una pgina escrita, el
concepto de archivo de registros en informtica no difiere del concepto #ue se
tiene fuera de ella. 1upongamos #ue la ctedra de 'rogramacin tiene un fichero
para cada comisin a su cargo. 'or cada alumno se tiene una tar"eta con la
informacin del mismo. Todas las tar"etas tienen la misma estructura y en cada
fichero hay tantas tar"etas como alumnos haya en la comisin. 1upongamos #ue la
estructura de la tar"eta es( matrcula del alumno, nombre, calificacin del primer
e*amen parcial, calificacin del segundo e*amen parcial y nota de concepto.
Archivo !omisin $ Archivo !omisin &
<ormato de cada tar"eta
BMu) operaciones se realizan con las tar"etas de un archivoC En primer lugar
debemos crear el fichero( esto es dise9ar el formato de cada tar"eta y asignarles un
lugar .una ca"a rectangular8. ,uego debemos escribir la informacin de cada
alumno( matricula y apellido y nombre .al inicio del a9o lectivo no se tienen las
calificaciones8. -na vez evaluado el primer e*amen debemos modificar cada
tar"eta agregando la calificacin correspondiente. 1upongamos #ue al mes de
iniciado el curso, ingresa un nuevo alumno, en tal caso debemos confeccionar la
tar"eta correspondiente y agregarla al fichero. A los dos meses un alumno
abandona el curso, entonces procedemos a eliminar la tar"eta del fichero o bien
agregarle una marca para indicar #ue ese alumno ya no concurre a clase. En la
mitad del curso debemos obtener un listado para presentar al /ecano, entonces
$&
Archivos
debemos recorrer el archivo, tar"eta por tar"eta, y volcar la informacin en una
ho"a de papel. En cual#uier momento un alumno puede preguntar por su situacin,
entonces debemos buscar la tar"eta correspondiente e informarle. Al final del curso
debemos presentar un listado #ue contenga a las dos comisiones "untas ordenadas
por apellido( en este caso debemos fusionar o intercalar los dos archivos,
ordenarlo por apellido y luego revisar tar"eta por tar"eta para volcar en papel la
informacin solicitada. Estas son algunas de las operaciones #ue pueden
presentarse.
,as mismas operaciones se realizan con archivos de disco. Estas
bsicamente son(
$. !reacin
&. Actualizacin, incluyendo
insercin de registros
modificacin de uno o ms campos
eliminacin de registros
=. Recuperacin, incluyendo
consulta
generacin de reportes
@. 0rdenacin
E. <usin
H. antenimiento
estructuracin
compactacin
Creaci%n &e Un 'rchivo
,a creacin de un archivo consiste en la asignacin de un lugar en el disco y
eventualmente en la carga de la informacin. ,a carga de la informacin puede
hacerse interactivamente o bien desde otro archivo.
'cua!i(aci%n &e Un 'rchivo
!onsiste en la insercin de nuevos registros o en la eliminacin de registros
#ue no se utilizan ms. Tambi)n puede ocurrir #ue debamos modificar uno o ms
datos del registro.
)ecuperaci%n &e La Informaci%n
E*isten bsicamente dos clases de recuperacin de la informacin( consulta
y generacin de reportes. ,a consulta, generalmente, produce poca informacin y
es interactiva, por e"emplo el alumno >Konzlez? pregunta #u) nota obtuvo en el
primer e*amen. En cambio, el reporte puede generar muchas pginas de salida de
informacin como obtener un listado de todos los alumnos #ue no han aprobado el
segundo e*amen.
$=
Archivos
$rdenaci%n
Keneralmente los archivos se crean con alg:n criterio de ordenacin, en el
e"emplo #ue estamos tratando puede ser la matrcula, pero en cual#uier momento
podemos necesitar el archivo ordenado por alg:n otro campo. Ac, como veremos
ms adelante, debemos considerar el caso de archivos chicos y archivos grandes.
Fu"i%n
,a fusin o intercalacin de archivos es otra tarea frecuente en los sistemas
de procesamiento de datos. 1upongamos un banco #ue decide cerrar una de sus
sucursales, entonces todos los clientes de )sta debern pasar a otra sucursal y por
lo tanto los archivos de ambas sucursales debern fusionarse.
*anenimieno &e 'rchivo"
!ambios hechos sobre archivos para me"orar la eficiencia de los programas
#ue los utilizan son conocidos como actividades de mantenimiento. /entro de este
tipo de operaciones debemos considerar la modificacin de la estructura de los
registros y la compactacin. 1upongamos #ue para cada alumnos deseamos
agregar una tercer nota, deberemos entonces recorrer todo el archivo modificando
la estructura de cada registro. ,a compactacin consiste en eliminar fsicamente
a#uellos registros #ue han sido dados de ba"a. Keneralmente cuando se elimina un
registro en realidad se lo marca como anulado. 1i hay muchas ba"as y no se realiza
compactacin el archivo tendr un porcenta"e elevado de registros #ue se
encuentran en desuso.
'unciones Relacionadas Con Arc!i"os +inarios
'ara abrir un archivo binario se utiliza la misma funcin fopen(), donde
algunos de los valores para modo pueden ser(
+rb, Abrir un archivo binario para lectura.
+-b, !rear un archivo binario para escribir.
+r.b, Abrir un archivo binario para lectura;escritura.
,as funciones para cerrar un archivo y para detectar el fin del mismo son las
mismas #ue para archivos de te*to. <inalmente para transferir informacin de la
memoria RA a un archivo se utiliza la funcin f-rie() .f( file, write( escribir8 y,
para transferir informacin de un archivo a la memoria RA se usa fread(), .f(
file+ read( leer8. En realidad estas dos funciones se pueden utilizar tanto con
archivos de te*to o con binarios, pero para los primeros es preferible usar f#ec(),
fpuc(), f#e"() o fpu"().
$@
Archivos
La 'uncin f.rite()
El prototipo de f-rie() es(
un"i#ned f-rie(void *p, in can_b/e", in conador, FILE *arch);
donde p es un puntero a void, can_b/e" y conador son enteros y arch es un
puntero a archivo. ,a funcin f-rie() transfiere contador#cant$bytes bytes desde
la direccin de memoria indicada por p al archivo asociado a arch.

El siguiente programa guarda el n:mero E en el archivo binario >numero.dat?.
#$nc%de &std$o.h'
#$nc%de &con$o.h'
ma$n()
( FILE * sa%$da;
$nt $;
sa%$da = fopen()nmero.dat),).!));
$ = :;
f.r$te(H$, 9, 7, sa%$da);
fc%ose(sa%$da);
-
,a sentencia(
f.r$te(H$, 9, 7, sa%$da);
transfiere dos bytes .tama9o de un entero8 desde la direccin de memoria Ti al
archivo lgico salida.
A continuacin se muestra otro e"emplo con f-rie().
#$nc%de &std$o.h'
#$nc%de &con$o.h'
#$nc%de &std%$!.h'
"o$d /enerarIa%eat(f%oat a03, $nt n);
ma$n()
( FILE * f;
f%oat a0723;
f = fopen()a%eator$os),).!));
/enerarIa%eat(a, 72);
f.r$te(a, D, 72, f);
fc%ose(f);
$E
Archivos
-
"o$d /enerarIa%eat(f%oat a03, $nt n)
( $nt $;
random$Be();
for ($ = 2; $ & n; $44)
a0$3 = random(7222);
-
,a sentencia(
f.r$te(a, D, 72, f);
transfiere @% bytes desde la variable a al archivo asociado con f. 2otar #ue en el
primer e"emplo usamos 0i y en el segundo simplemente a Bpor #u)C.
! proporciona la funcin "i(eof() #ue es muy :til pues nos evita recordar el
tama9o de los enteros, float, double, etc. 'ara invocarla, escibimos(
"i(eof(ipo_de_dao");
donde ipo_de_dao" es cual#uier tipo permitido, incluso un tipo "ruc, y el
valor de retorno es la cantidad de bytes #ue ocupa ese tipo.
1a!or de reorno
sizeof.int8+ &
sizeof.double8+ P
struct emp
U int edad+
char se*o+
int depto+
char categoria+
V+
sizeof.emp8+
H
En el siguiente e"emplo vamos a crear un archivo y alamacenar en )l, el
n:mero de matrcula, el apellido y nombre y la calificacin del primer e*amen de
los alumnos correspondientees a una comisin. 'rever #ue otros programas puedan
ingresar las calificaciones de otros dos e*amenes+ dar de ba"a a registros #ue
$H
Archivos
corresponden a alumnos #ue han abandonado el curso o bien dar de alta a nuevos
alumnos.
En primer lugar debemos definir la estrucutura re# como sigue(
strct re/
( char matr$c%a0:3;
char ape%Inom0>23;
$nt ca%$fI7;
$nt ca%$fI9;
$nt ca%$fI>;
char !orrado;
-;
El campo borrado tendr el valor W2X para los alumnos activos y el valor W1X
para alumnos #ue han sido de ba"a. El siguiente programa crea un archivo llamado
>comisY$?, lee la informacin desde el teclado y la almacena en el archivo.
#$nc%de &std$o.h'
#$nc%de &con$o.h'
#$nc%de &str$n/.h'
#$nc%de &entrada.h'
#$nc%de &std%$!.h'
FILE *a!r$r();
"o$d a%tas (FILE * arch);
$nt "a%$do7(char c);
strct re/
( char matr$c%a0:3;
char ape%Inom0>23;
$nt ca%$fI7;
$nt ca%$fI9;
$nt ca%$fI>;
char !orrado;
-;
ma$n()
( FILE * arch;
arch = a!r$r();
a%tas(arch);
fc%ose(arch);
-
"o$d a%tas (FILE * arch)
( strct re/ a%mno;
char nota0>3;
c%rscr();
pr$ntf()Gatr$c%a: ));
/oto*8(92,7);
/etstr(a%mno.matr$c%a, D, D, "a%$do7);
.h$%e (strcmp(a%mno.matr$c%a, )2222)) 5= 2)
$I
Archivos
( /oto*8(7,>);
pr$ntf()Ape%%$do 8 +om!re: ));
/oto*8(7,:);
pr$ntf()<a%$f$cac$on 7: ));
/oto*8(92, >);
/ets(a%mno.ape%Inom);
/oto*8(92,:);
/etstr(nota, 7, 9, "a%$do7);
a%mno.ca%$fI7 = ato$(nota);
a%mno.!orrado = J+K;
f.r$te(Ha%mno,s$Beof(strct re/),7,arch);
c%rscr();
pr$ntf()Gatr$c%a: ));
/oto*8(92,7);
/etstr(a%mno.matr$c%a, D, D, "a%$do7);
-
-
$nt "a%$do7(char c)
(
retrn ( c '= L2L) HH (c &= L@L);
-
FILE *a!r$r()
( FILE *pf;
char nomIarch07:3;
c%rscr();
pr$ntf()In/resar nom!re de% arch$"o: ));
/ets(nomIarch);
pf = fopen(nomIarch,)r4!));
$f (pf == +,LL)
pf = fopen(nomIarch,).!));
retrn pf;
-
Faremos el seguimiento de este algoritmo. Al declarar las variables arch,
re# y nom_arch, #uedan definidas tres variables en la memoria RA de la
siguiente manera(
*emoria )'*
arch alumno nomYarch
matricula apelYnom califY$ califY& califY= borrado
En primer lugar se solicita al usuario #ue ingrese un nombre de archivo el
#ue se guarda en la variable nom_arch. 1upongamos #ue el usuario escriba
comis$, entonces la memoria tendr el siguiente aspecto.
*emoria )'*
$P
Archivos
arch alumno nomYarch
comisY$
matricula apelYnom califY$ califY& califY= borrado
Al e"ecutarse arch 2 fopen(nom_arch,,-b,), se crea un archivo en disco
llamado >comisY$? y la variable arch apunta al mismo.
*emoria )'*
arch alumno nomYarch
comisY$
matricula apelYnom califY$ califY& califY= borrado

&i"co
comis$ %! bytes&
,uego el programa solicita al usuario #ue ingrese un n:mero de matrcula
#ue almacena en el campo maricu!a de la variable a!umno. 1upongamos #ue
ingresa IPEH.
*emoria )'*
arch alumno nomYarch
IPEH comisY$
matricula apelYnom califY$ califY& califY= borrado

&i"co
comis$ %! bytes&

!omo este valor es distinto de >%%%%? comienza a e"ecutarse el ciclo -hi!e
en el cual se solicita el nombre y apellido del alumno y la calificacin del primer
e*amen. 1upongamos #ue el usuario ingresa >Konzlez Alberto? y como
calificacin un E. 0bservar #ue el algoritmo asigna Z2Z a a!umno3borrrado.
*emoria )'*
arch alumno nomYarch
IPEH Konzlez Alberto E 2 comisY$
matricula apelYnom califY$ califY& califY= borrado
$Q
Archivos

&i"co
comis$ %! bytes&
,uego se e"ecuta la accin f-rie(0a!umno, "i(eof(re#), 4, arch);' la
informacin #ue est en la variable a!umno se transfiere al archivo >comisY$?,
#uedando(
*emoria )'*
arch alumno nomYarch
IPEH Konzlez Alberto E 2 comisY$
matricula apelYnom califY$ califY& concepto borrado
&i"co
comis$
IPEH Konzlez Alberto 2
,a funcin fArite() adems de transferir la informacin de la memoria al
archivo de disco hace avanzar el puntero de archivo tantos bytes como tenga el
registro.
El programa continua solicitando otro n:mero de matrcula, #ue se lee en
a!umno3maricu!a, reemplazando el valor ledo al #ue estaba antes. 'or e"emplo,
*emoria )'*
arch alumno nomYarch
IPH% Konzlez Alberto E 2 comisY$
matricula apelYnom califY$ califY& concepto borrado
&i"co
comis$
IPEH Konzlez Alberto E 2

!omo el valor ledo es diferente de cero se e"ecuta el ciclo -hi!e #ue solicita
un nuevo nombre y otra calificacin #ue se leee en a!umno3nombre y en
a!umno3ca!if_4 respectivamente y se asigna [2[ a a!umno3borrado.
*emoria )'*
&%
Archivos
arch alumno nomYarch
IPH% artinez Jorge P 2 comisY$
matricula apelYnom califY$ califY& concepto borrado
&i"co
comis$
IPEH Konzlez Alberto 2
1e e"ecuta nuevamente la f-rie(), #uedando,
*emoria )'*
arch alumno nomYarch
IPH% artinez Jorge P 2 comisY$
matricula apelYnom califY$ califY& concepto borrado
&i"co
comis$
IPEH Konzlez Alberto 2 IPH% artnez Jorge P 2
As sigue el algoritmo hasta #ue se ingresa desde el teclado el valor de
maricu!a igual a >%%%%?, con lo cual termina el ciclo -hi!e y se cierra el archivo.
$%ercicios
E"ercicio $@.\
Escribir un pogrma para construir un archivo de $% n:meros enteros #ue se
ingresan por teclado.

Escribir funciones para(
a. crear un archivo de !lientes, donde cada cliente consta de la siguiente
informacin( nombre, calle, n:mero, localidad y provincia, cuit, saldo.
b. cargar datos en el archivo anterior.
!rear y cargar datos en un archivo de alumnos, cada registro debe contener la
siguiente informacin( nombre, direccin, edad y fecha.
&$
Archivos
La 'uncin fread()
-n archivo binario no puede ser visualizado con un editor de te*to. 'or
e"emplo, el si abrimos el archivo [aleatorios[, construido anterioemente, con
20TE'A/ o cual#uier otro editor veriamos algo similar alo siguiente(
9999 < 99MN<99M1O9999PO9999Q<99RO9999<99S O9999T<99RsO
'ara leer un archivo binario debemos usar fread(). El prototipo de esta
funcin es(
un"i#ned fread(void *p, in can_b/e", in conador, FILE *arch);
donde p es un puntero a void, can_b/e" y conador son enteros y arch es un
puntero a archivo. ,a funcin fread() transfiere contador#cant$bytes bytes desde
el archivo asociado a arch a la direccin de memoria indicada en p.
'ara leer un archivo e*istente debemos abrirlo en modo lectura o
lectura;escritura. ,a e"ecucin de esta funcin asegura la localizacin del archivo
en el soporte e*terno y el posicionamiento del apuntador al principio del archivo
inmediatamente antes del primer registro del archivo. !ada e"ecucin de fread()
lee contador#cant$bytes en la direccion indicada en p y desplaza el apuntador del
archivo para de"arlo inmediatamente antes de los pr*imis bytes a leer. ,a funcin
feof(arch) es evaluada automticamente cada vez #ue se realiza una operacin de
lectura y tiene el valor falso mientras el apuntador no haya pasado la marca de fin
de archivo. Toma el valor cierto en el momento en #ue la e"ecucin de fread()
encuentre la marca fin de archivo.
,os programas siguientes leen y muestran por pantalla los archivos
>numero.dat? y >aleatorios? construidos anteriormente.
#$nc%de &std$o.h'
#$nc%de &con$o.h'
ma$n()
( FILE * sa%$da;
$nt $;
sa%$da = fopen()nmero.dat),)r!));
fread(H$, 9, 7, sa%$da);
pr$ntf()6d), $);
/etch();
fc%ose(sa%$da);
-
#$nc%de &std$o.h'
#$nc%de &con$o.h'
ma$n()
( FILE * a%eat;
&&
Archivos
f%oat a0723;
$nt $;
a%eat = fopen()a%eator$os),)r!));
fread(a, D, 72, a%eat);
fc%ose(a%eat);
c%rscr();
for ($ = 2; $ & 72; $44)
pr$ntf()\n6?.9f),a0$3);
/etch();
-
,a siguiente funcin nos permite visualizar el archivo >comisY$?.
"o$d mostrar (FILE * arch)
( strct re/ a%mno;
$nt %$nea=>;
c%rscr();
pr$ntf()Gatr$c%a Ape%%$do 8 +om!re <a%$f$cac$on
7));
fread(Ha%mno, s$Beof(re/), 7, arch);
.h$%e (5 feof(arch))
( /oto*8(7,%$nea);
pr$ntf()6s), a%mno.matr$c%a);
/oto*8(92,%$nea);
pr$ntf()6s), a%mno.ape%Inom);
/oto*8(:2,%$nea);
pr$ntf()6d), a%mno.ca%$fI7);
%$nea44;
fread(Ha%mno, s$Beof(re/), 7, arch);
-
pr$ntf()\n\nEpr$m$r na tec%a para cont$nar...) );
/etch();
-
,a siguiente figura muestra la evolucion del valor de arch y de la funcin feof() a
medida #ue se e"ecuta este programa..
(espus de la apertura del archivo'
&i"co
comis$
R$ R& R= . . . Rn ;R
arch valor de eof.arch8
%
&=
Archivos
(espus de la primera e)ecucin de fread()'
R$ R& R= . . . Rn ;R
arch valor de eof.arch8
%
(espus de la n-sima e)ecucin de fread()'
R$ R& R= . . . Rn ;R
arch valor de eof.arch8
%
(espus de la %n*&-sima e)ecucin de fread()'
R$ R& R= . . . Rn ;R
arch valor de eof.arch8
$
,a e"ecucuin del programa anterior muestra una salida por pantalla similar a(
atricula Apellido y 2ombre !alificacion $
IPQH Konzalez Alberto E
IPH% artinez Jorge P
HEH% 1mith Roberto H
IPQ% 1ilveira 1ebastian =
PQQ% Rizzo Juan &
IEEE Rodriguez 'edro E
0primir una tecla para continuar...
&@
Archivos
$%ercicios
Escribir un algoritmo #ue bus#ue en el archivo de enteros construido en el e"ercicio
$@\, el entero ms pe#ue9o y ms grande del archivo.
visualizar el archivo construido en e"ercicio $@.\
Disualizar el archivo creado en $@\
La 'uncin fsee/()
En este :ltimo e"emplo hemos procesado al archivo secuencialmente+ lemos
el primer registro y mostramos alunos campos por pantalla, luego lemos rl
segundo registro y as sucesivamente hasta encontrar el fin del archivo. 1in
embsrgo en muchas aplicaciones es necesario acceder a la informacin de un
determinado registro. ,a funcin f"ee5() nos permite accder directamente a
cualuier posicin del archivo, sin necesidad de leer toda la informacin anterior.
1u prototipo es(
in f"ee5(FILE *arch, !on# num_b/e", in ori#en);
donde arch es un puntero a archivo, num_b/e" es un entero largo y ori#en es un
entero cuyos valores pueden ser %, $ &. El valor de num_b/e" es la cantidad de
bytes a partir de origen #ue debe tomarse como la nueva posicin actual. ,os
valores de origen tiene el siguiente significado.
67 'rincipio del archivo
47 'osicin actual
87 <in de archivo
El siguiente programa muestra el cuarto n:mero del archivo ?aleatorios?.
#$nc%de &std$o.h'
#$nc%de &con$o.h'
ma$n()
( FILE * a%eat;
f%oat !;
a%eat = fopen()a%eator$os),)r!));
c%rscr();
fseeU(a%eat, 79, 2);
fread(H!, D, 7, a%eat);
pr$ntf()\n6?.9f),!);
/etch();
&E
Archivos
fc%ose(a%eat);
-
Al-orit*os Para La Recuperacin e La Infor*acin
En este grupo de algoritmos se encuentra la consulta, generalmente
interactiva, y el informe o reporte, generalmente salida impresa, aun#ue tambi)n
puede ser por pantalla o incluso a archivo de disco.
Informe
-n informe simple se refiere a mostrar los campos de todos los registros o
slo algunos campos o bien algunos o todos los campos de los registros #ue
cumplen alguna condicin. -n e"emplo de informe es la funcin mo"rar()
desarrollada en la seccin anterior. 0tro e"emo de informe es els siguiente(
0btener un listado de los alumnos inscriptos en la comisin $ #ue no
aprobaron el primer e*amen, mostrando al final del mismo la cantidad total de
alumnos inscriptos y la cantidad y porcenta"e de insuficientes.
'ara obtener este informe debemos recorrer el archivo desde el primer
registro hasta encontrar el fin del archivo y por cada uno debemos consultar por la
calificacin del primer e*amen e imprimir la matrcula y el nombre de a#uellos
#ue han obtenido una calificacin menor a @. Adems debemos llevar un contador
para los alumnos inscriptos y otro para los #ue no aprobaron.
"o$d $nforme (FILE * arch)
( strct re/ a%mno;
$nt %$nea=>;
$nt $nscr, $nsf;
c%rscr();
pr$ntf()Gatr$c%a Ape%%$do 8 +om!re));
$nscr = 2;
$nsf = 2;
fseeU(arch,2,2); V* arch apnta a% $n$c$o de% arch$"o*V
fread(Ha%mno, s$Beof(re/), 7, arch);
.h$%e (5feof(arch))
( $f (a%mno.!orrado == L+L)
( $nscr44;
$f (a%mno.ca%$fI7 & D)
( $nsf44;
/oto*8(7,%$nea);
pr$ntf()6s), a%mno.matr$c%a);
/oto*8(92,%$nea);
pr$ntf()6s), a%mno.ape%Inom);
%$nea44;
-
-
fread(Ha%mno, s$Beof(re/), 7, arch);
-
pr$ntf()\n\nWota% de $nscr$ptos: 6d), $nscr);
&H
Archivos
pr$ntf()\nWota% de $nsf$c$entes: 6d), $nsf);
pr$ntf()\n=orcentaje de $nsf$c$entes: 6:.9f),
722.2*$nsfV$nscr);
pr$ntf()\n\nEpr$m$r na tec%a para cont$nar...) );
/etch();
-
El imforme #ue se obtiene es similar al siguiente(
atricula Apellido y 2ombre
IPQ% 1ilveira 1ebastian
PQQ% Rizzo Juan
Total de inscriptos( H
Total de insuficientes( &
'orcenta"e de insuficientes( ==.==
0primir una tecla para continuar...
Todos los algoritmos para recorrer un archivo constan de los siguientes
pasos( colocar la variable puntero de archivo al inicio de )ste, leer el primer
registro, mientras no sea el fin del archivo procesar el registro reci)n ledo y leer el
pr*imo registro, repetir estos dos :ltimos pasos hasta llegar la final del archivo.
!uando )ste se ha alcanzado, generalmente, hay #ue e"ecutar un proceso final.
Con"u!a de un re#i"ro
1upongamos #ue deseamos consultar la informacin de un alumno
conociendo su matrcula. !omo el archivo no est ordenado debemos realizar una
b:s#ueda secuencial, similar a la #ue realizZbamos cuando la informacin est
almacenada en arreglos. 'osicionar al puntero de archivo al incio del mismo+
acceder al primer registro, si el campo mar9cu!a es igual a la matrcula dada
mostramos la informacin, sino accedemos al segundo registro+ se contin:a as
hasta #ue se encuentre la matrcula o se haya accedido al final del archivo. ,a
funcin bu"car() busca la matricula en el archivo, si la encuentra retorna el
n:mero de registro correspondiente y si no la encuentra retorna ]$.
"o$d cons%ta (FILE * arch)
( strct re/ a%mno;
char matIaI!scar0:3;
$nt U;
c%rscr();
&I
Archivos
pr$ntf()In/resar matr$c%a: ));
/etstr(matIaI!scar, D,D, "a%$do7);
.h$%e (strcmp(matIaI!scar,)2222)) 5= 2)
( U = !scar(matIaI!scar, arch);
$f ( U 5= X7)
( fseeU(arch, U*s$Beof(re/), 2);
fread(Ha%mno, s$Beof(re/), 7 ,arch);
$f (a%mno.!orrado == L+L)
(
pr$ntf()\nApe%%$do 8 +om!re: 6s), a%mno.ape%Inom);
pr$ntf()\n\n<a%$f$cac$on 7: 6d), a%mno.ca%$fI7);
pr$ntf()\n\n<a%$f$cac$on 9: 6d), a%mno.ca%$fI9);
pr$ntf()\n\n<a%$f$cac$on >: 6d), a%mno.ca%$fI>);
pr$ntf()\n\nEpr$ma na tec%a para cont$nar...));
/etch();
-
e%se
( pr$ntf()\n\nLa matr$c%a no se encontro));
/etch();
-
-
e%se
( pr$ntf()\n\nLa matr$c%a no se encontro));
/etch();
-
c%rscr();
pr$ntf()In/resar matr$c%a: ));
/etstr(matIaI!scar, D,D, "a%$do7);
-
-
$nt !scar (char mat03, FILE * arch)
( strct re/ a%mno;
$nt $;
$ = 2;
fseeU(arch, 2, 2);
fread(Ha%mno, s$Beof(re/), 7, arch);
.h$%e (5feof(arch))
( $f (strcmp(mat,a%mno.matr$c%a) == 2)
retrn $;
fread(Ha%mno, s$Beof(re/), 7, arch);
$44;
-
retrn X7;
-
,a funcin con"u!a() muestra una pantalla como la siguiente(
3ngresar matricula( IPQH
Apellido y 2ombre( <ernandez 1ebastian
&P
Archivos
!alificacion $( P
!alificacion &( ]@PHE
!alificacion =( ]$PQ@E
0prima una tecla para continuar...
,os valores absurdos de la segunda y tercera calificacin se deen a #ue a los
campos a!umno3ca!if_8 y a!umno"3ca!if_: no se le han asignado ning:n valor. Es
conveniente #ue en la funcion a!a() a a#uellos campos #ue no tienen valores, se
les asigne el valor nulo del tipo de dato correspondiente.
$%ercicios
-tilizando el archivo creado en $@\
c. consultar un cliente.
b. !onstruir funciones #ue permitan responder a las siguientes preguntas(
a. B!uales clientes tienen saldo inferior a %C
b. B!uantos clientes viven en la provincia de !rdobaC
c. ,istar los clientes cuyo nombre comienza con ^^C
d. B!ual es el cliente con saldo mayorC
A pertir del archivo de alumnos creado en e"ercicio $@\, escibir funciones para(
construir un nuevo archivo #ue contenga slo los nombres y edad
obtener un listado con el nombre y direccin de cada alumno cuyos nombres
comiencen con las letras A, 5 o ! y hayan nacido en el mes de mayo.
Al-orit*os Para Actuali0ar Arc!i"os
,as tres operaciones de actalizacin de archivos son(

a!a"( ingreso de nuevos registros
ba;a"( eliminacin de registros #ue no se necesitan ms
modificaci%n7 modificar la informacin de uno o ms campos uno ms
registros
&Q
Archivos
'!a"
!omo hemos dicho al principio del captulo siempre es conveniente #ue
haya un dato, #ue se denomuina clave, #ue identifi#ue en forma biunvoca al
registro. En el e"emplo #ue estmos tratando este dato pueder ser la matrcula, ya
#ue no hay dos alumnos con la misma matrcula.
'ara realizar un alta posteriormente a haber creado el archivo e ingresado
algunos datos, debemos(
solcitar la clave %en este e)emplo la matrcula&+
buscar la matricula en el archivo+
si la matrcula ya existe+
emitir un mensa)e de error+
sino
solictar los datos al usuario+
grabarlos en el archivo+
,a funcin a!a"() descripta anteriormente permite el ingreso de datos en un
archivo vaco. A continuacin la funcin #ue se describe puede usarse si el archivo
est vaco o si ya contiene algunos datos.
"o$d a%tas (FILE * arch)
( strct re/ a%mno;
char nota0>3;
$nt U;
c%rscr();
pr$ntf()In/resar matr$c%a: ));
/etstr(a%mno.matr$c%a, D,D, "a%$do7);
.h$%e (strcmp(a%mno.matr$c%a,)2222)) 5= 2)
( U = !scar(a%mno.matr$c%a, arch);
$f ( U == X7)
(
/oto*8(7,>);
pr$ntf()Ape%%$do 8 +om!re: ));
/oto*8(7,:);
pr$ntf()<a%$f$cac$on 7: ));
/oto*8(92, >);
/ets(a%mno.ape%Inom);
/oto*8(92,:);
/etstr(nota, 7, 9, "a%$do7);
a%mno.ca%$fI7 = ato$(nota);
a%mno.!orrado = L+L;
fseeU(arch,2,9);
f.r$te(Ha%mno,s$Beof(strct re/),7,arch);
-
e%se
( pr$ntf()\n\nLa matr$c%a 8a e*$ste));
/etch();
=%
Archivos
-
c%rscr();
pr$ntf()In/resar matr$c%a: ));
/etstr(a%mno.matr$c%a, D,D, "a%$do7);
-
-
<a;a"
0tra de las operaciones frecuentes en el mane"o de archivos es la
eliminacin lgica de registros. Esta operacin consiste en marcar alg:n campo de
manera #ue indi#ue #ue el registro ha sido borrado. 1e puede disponer alg:n
campo para tal fin, como en el e"emplo, o bien considerar alg:n campo con un
valor ilegal, como por e"emplo, un WRX para nombre y apellido. ,os pasos a seguir
son(
solcitar la clave %en este e)emplo la matrcula&+
buscar la matricula en el archivo+
si la matrcula no existe+
emitir u n mensa)e de error+
sino
marcar el campo ,ue indica ,ie el registro est- borrado+
"o$d !ajas (FILE * arch)
( strct re/ a%mno;
$nt U;
c%rscr();
pr$ntf()In/resar matr$c%a: ));
/etstr(a%mno.matr$c%a, D,D, "a%$do7);
.h$%e (strcmp(a%mno.matr$c%a,)2222)) 5= 2)
( U = !scar(a%mno.matr$c%a, arch);
$f ( U 5= X7)
( fseeU(arch, U*s$Beof(re/), 2);
fread(Ha%mno, s$Beof(re/), 7, arch);
pr$ntf()Esta a pnto de !orrar a% a%mno));
pr$ntf() 6s ),a%mno.ape%Inom);
/etch();
a%mno.!orrado = LAL;
fseeU(arch, U*s$Beof(re/), 2);
f.r$te(Ha%mno,s$Beof(strct re/),7,arch);
-
e%se
( pr$ntf()\n\nLa matr$c%a +E e*$ste));
/etch();
-
c%rscr();
pr$ntf()In/resar matr$c%a: ));
/etstr(a%mno.matr$c%a, D,D, "a%$do7);
-
-
=$
Archivos
*odificacione"
Esta operacin es muy similar a la ba"a lgica. ,os pasos a seguir son(
solcitar la clave %en este e)emplo la matrcula&+
buscar la matricula en el archivo+
si la matrcula no existe+
emitir u n mensa)e de error+
sino
solictar nuevos datos+
actuali.ar los campos ,ue correspondan+
En la siguiente funcin se modifica la calificacin del segundo o tercer e*amen.
"o$d mod$f$cac$ones (FILE * arch, $nt $)
( strct re/ a%mno;
$nt n;
char nota0>3;
$nt U;
n = %eerInroIe*amen();
c%rscr();
pr$ntf()In/resar matr$c%a: ));
/etstr(a%mno.matr$c%a, D,D, "a%$do7);
.h$%e (strcmp(a%mno.matr$c%a,)2222)) 5= 2)
( U = !scar(a%mno.matr$c%a, arch);
$f ( U 5= X7)
( fseeU(arch, U*s$Beof(re/), 2);
fread(Ha%mno, s$Beof(re/), 7, arch);
$f (a%mno.!orrado == L+L)
( pr$ntf ()In/resar %a ca%$f$cac$on de% e*amen 6d: ), n);
/etstr(nota,7,9,"a%$do7);
$f (n == 9)
a%mno.ca%$fI9 = ato$(nota);
e%se
a%mno.ca%$fI> = ato$(nota);
fseeU(arch, U*s$Beof(re/), 2);

f.r$te(Ha%mno,s$Beof(strct re/),7,arch);
-
e%se
( pr$ntf()\n\nLa matr$c%a +E e*$ste));
/etch();
-
-
e%se
( pr$ntf()\n\nLa matr$c%a +E e*$ste));
/etch();
-
=&
Archivos
c%rscr();
pr$ntf()In/resar matr$c%a: ));
/etstr(a%mno.matr$c%a, D,D, "a%$do7);
-
-
$nt %eerInroIe*amen()
( $nt n;
char cn093;
c%rscr();
pr$ntf()$n/resar nmero de e*amen: ));
/etstr(cn,7,7,"a%$do9);
n = ato$(cn);
retrn n;
-
$%ercicios
dar de alta un nuevo cliente
eliminar un cliente .un cliente se considera dado de ba"a si hay un WRX en su nombre.
dado un cliente modificar sus datos
T1tulo no se
En las secciones anteriores hemos construidos las funciones para crear y
actualizar archivos, as como las de recupracin de la informacin en forma
separada. !omo hay muchas funciones comunes a todas ellas( bu"car(), va!ido4(),
abrir(), ahora vamos a compaginarlas de manera #ue todas sean invocadas desde
un :nico main.8 mediante un menu.
#$nc%de &std$o.h'
#$nc%de &con$o.h'
#$nc%de &str$n/.h'
#$nc%de &entrada.h'
#$nc%de &std%$!.h'
FILE *a!r$r();
"o$d a%tas (FILE * arch);
"o$d !ajas (FILE * arch);
"o$d mod$f$cac$ones (FILE * arch, $nt nroe*amen);
"o$d mostrar (FILE * arch);
"o$d cons%ta (FILE * arch);
"o$d $nforme (FILE * arch);
$nt "a%$do7(char c);
$nt "a%$do9(char c);
$nt !scar (char mat03, FILE * arch);
char men();
==
Archivos
$nt %eerInroIe*amen();
strct re/
( char matr$c%a0:3;
char ape%Inom0>23;
$nt ca%$fI7;
$nt ca%$fI9;
$nt ca%$fI>;
char !orrado;
-;
"o$d ma$n()
( FILE * arch;
char opc$on;
$nt nro;
arch = a!r$r();
opc$on = L2L;
.h$%e (opc$on 5= L?L)
( opc$on = men();
s.$tch (opc$on)
( case L7L:
a%tas(arch);
!reaU;
case L9L:
!ajas(arch);
!reaU;
case L>L:
mod$f$cac$ones(arch, nro);
!reaU;
case LDL:
mostrar(arch);
!reaU;
case L:L:
cons%ta(arch);
!reaU;
case L;L:
$nforme(arch);
!reaU;
-
-
fc%ose(arch);
c%rscr();
pr$ntf()Yrac$as por sar este pro/rama));
/etch();
-
FILE *a!r$r()
(
V* desarro%%ada en secc$Zn anter$or*V
-
"o$d a%tas (FILE * arch)
=@
Archivos
(
V* desarro%%ada en secc$Zn anter$or*V
-
"o$d !ajas (FILE * arch)
(
V* desarro%%ada en secc$Zn anter$or*V
-
"o$d mod$f$cac$ones (FILE * arch, $nt $)
(
V* desarro%%ada en secc$Zn anter$or*V
-
"o$d mostrar (FILE * arch)
(
V* desarro%%ada en secc$Zn anter$or*V
-
"o$d cons%ta (FILE * arch)
(
V* desarro%%ada en secc$Zn anter$or*V
-
"o$d $nforme (FILE * arch)
(
V* desarro%%ada en secc$Zn anter$or*V
-
$nt !scar (char mat03, FILE * arch)
(
V* desarro%%ada en secc$Zn anter$or*V
-
char men()
( char opc$on;
c%rscr();
/oto*8(9:,:);
pr$ntf ()7. A%tas));
/oto*8(9:,;);
pr$ntf ()9. Fajas));
/oto*8(9:,?);
pr$ntf ()>. God$f$cac$ones));
/oto*8(9:,1);
pr$ntf()D. [$sa%$Bar));
/oto*8(9:, @);
pr$ntf ():. <ons%ta));
/oto*8(9:,72);
pr$ntf ();. Informes));
/oto*8(9:,77);
pr$ntf ()?. Werm$nar));
do (
/oto*8(9:,7>);
pr$ntf()In/resar opc$on: ));
=E
Archivos
opc$on = /etche();
- .h$%e ((opc$on & L7L) \\ (opc$on ' L?L));
retrn opc$on;
-
$nt %eerInroIe*amen()
(
V* desarro%%ada en secc$Zn anter$or*V
-
$nt "a%$do7(char c)
(
V* desarro%%ada en secc$Zn anter$or*V
-
$nt "a%$do9(char c)
(
retrn ( c '= L9L) HH (c &= L>L);
-
0tra forma ms elegante de actualizar y cargar interactivamente en un
archivo es el proceso #ue se describe a continuacin. ,os pasos a seguir son(
solicitar la clave %en este e)emplo la matrcula&+
buscar la matricula en el archivo+
si la matrcula no existe+
altas%&+
sino
mostrar el registro+
consultar al usuario si es ba)a o modificacin
si es ba)a
ba)as%&+
sino
modificacion%&+
$%ercicio
!oficicar en ! el enunciado anterior.
Al-orit*os Para 'usin e Arc!i"os
,a fusin de archivos consiste en construir un archivo a partir de dos .o ms8
archivos. Tanto los archivos orgenes como el destino deben tener todos el mismo
formato de registro. 1upongamos #ue la comisin $ y & se unen, entonces los dos
archivos deben tambi)n "untarse. 1i los archivos no estn ordenados por ning:n
campo escribimos simplemente un archivo al final del otro, pero si los archivos
=H
Archivos
estn ordenados por alguno de sus campos, por e"emplo, matrcula podemos
intercalarlos para obtener un tercer archivo ya ordenado. ,a intercalacin de dos
archivos ordenados consiste en construir a partir de ellos un tercer archivo tambi)n
ordenado. El proceso de intercalacin se realiza, en forma similar #ue en el caso de
arreglos, seleccionando sucesivamente los elementos con el mnimo valor de cada
uno de los dos archivos, situndolos en el nuevo. /e esta forma el nuevo archivo
tiene todos sus elementos ordenados. El algoritmo bsico de intercalacin de
archivos consiste en comparar la clave de un archivo con la del otro, pasar la
menor al nuevo archivo y avanzar en ese archivo y en el nuevo.
#$nc%de &std$o.h'
#$nc%de &con$o.h'
#$nc%de &str$n/.h'
FILE *a!r$r();
"o$d fs$on(FILE *f7, FILE *f9, FILE *f>);
strct re/
( char matr$c%a0:3;
char ape%Inom0>23;
$nt ca%$fI7;
$nt ca%$fI9;
$nt ca%$fI>;
char !orrado;
-;
ma$n()
( FILE *arch7, *arch9, *arch>;
arch7 = a!r$r();
arch9 = a!r$r();
arch> = a!r$r();
fs$on(arch7, arch9, arch>);
fc%ose(arch7);
fc%ose(arch9);
fc%ose(arch>);
-
FILE *a!r$r()
( FILE *pf;
char arch$"o07:3;
c%rscr();
pr$ntf()In/resar nom!re de% arch$"o: ));
/ets(arch$"o);
pf = fopen(arch$"o,)r4!));
$f (pf == +,LL)
pf = fopen(arch$"o,).!));
retrn pf;
-
=I
Archivos
"o$d fs$on (FILE *f7, FILE *f9, FILE *f>)
( strct re/ "7, "9;
fseeU(f7,2,2);
fseeU(f9,2,2);
fread(H"7,s$Beof(re/), 7, f7);
fread(H"9,s$Beof(re/), 7, f9);
.h$%e(5feof(f7) HH 5feof(f9))
$f (strcmp("7.matr$c%a, "9.matr$c%a) == X7)
( f.r$te(H"7,s$Beof(re/), 7, f>);
fread(H"7,s$Beof(re/), 7, f7);
-
e%se
( f.r$te(H"9,s$Beof(re/), 7, f>);
fread(H"9,s$Beof(re/), 7, f9);
-
$f (feof(f7))
( fread(H"9,s$Beof(re/), 7, f9);
.h$%e (5feof(f9))
( f.r$te(H"9,s$Beof(re/), 7, f>);
fread(H"9,s$Beof(re/), 7, f9);
-
-
e%se
( fread(H"7,s$Beof(re/), 7, f7);
.h$%e (5feof(f7))
( f.r$te(H"7,s$Beof(re/), 7, f>);
fread(H"7,s$Beof(re/), 7, f7);
-
-
-
E)ercicos
(ados dos archivos' disgmos suc y suc "' ,ue contiene informacin de clienes de dos
sucursales de un banco' construir suc/ formado por los registros de suc seguidos por los
registros de suc".
Al-orit*os de 2anteni*iento
Entre los algoritmos de mantenimiento estn a#uellos #ue modifican la estructura
de los registros y los de compactacin.
*odificaci%n &e E"rucura
1upongamos #ue tenemos un archivo cuyos registros tienen una estructura re#4, y
debemos agregarle algunos campos #ue no haban sido previstos .por e"emplo en
el archivo de alumnos debemos agregar la calificacin del e*amen final8, o bien
modificar el tama9o de alg:n campo. /efinimos entonces una nueva estrucutrua
=P
Archivos
re#8 y dos punteror a archivos, arch4 y arch8. Tambi)n debemos definir dos
variables, v4 de tipo re#4 y v8 de tipo re#8, El algoritmo para modificar la
estructura consiste en abrir el archivo e*istente para lectura y otro nuevo para
escritura+ leer cada registro del archivo vie"o en v4+ asignar los campos comunes
entre ambos registros a v8+ escribir v8 en el archivo nuevo+ cuando se llega al fin
del archivo asociado a arch4 cerrar ambos archivos.
Compacaci%n
!on compactacin se entiende eliminar fsicamente del archivo, a#uellos registros
#ue han sido eliminados lgicamente. 1ean la estructura re# y arch4 y arch8 de
tipo puntero a archivo, y v una variable de tipo re#. El primer archivo se abre para
lectura y el segundo para escritura+ se lee de arch4 en v, si el valor de v3borrado
es W2X .o cual#uiera sea la condicin de registro no eliminado8 se e"ecuta la accin
f-rie(0v, "i(eof(re#), 4, arch8), en caso contrario no se efect:a ninguna accin+
en ambos casos se continua con el pr*imo registro+ finalmente se cierran ambos
archivos.
E"ercicios
$, En el archivo >comisY$? se desea, para cada alumno, guardar la nora del
e*amen final.
&. !ompactar el archivo >comisY$?.

Ordenacin
,a ordenacin de archivos se la conoce como ordenacin externa. 1i el archivo es
lo suficientemente pe#ue9o como para #ue pueda caber en la memoria principal de
la computadora, los pasos a seguir son( $8 leer el archivo en un arreglo+ &8 aplicar
un m)todo de ordenacin interna y =8 grabar el arreglo ordenado en el archivo.
!uando los archivos son muy grandes, demasiado grandes para #ue puedan caber
en la memoria principal se debe leer porciones del archivo, aplicar un m)todo de
ordenacin interna a cada porcin y generar de esta manera subarchivos
ordenados, los cuales deben ser intercalados para obtener el archivo final.
-n m)todo de ordenacin e*terna consta de dos fases( ordenacin interna e
intercalacin de archivos. !omo el proceso de entrada y salida es mucho ms lento
#ue las comparaciones en memoria, el costo de un algoritmo de ordenacin
e*terna no est dado por la cantidad de comparaciones y movimientos en la
memoria principal sino por la cantidad de veces #ue hay #ue recorrer el archivo.
En este :ltimo punto influye el medio de almacenamiento e*terno en el cual est
guardado el archivo( por e"emplo, elementos guardados en una cinta magn)tica
pueden ser accedidos solo en manera secuencial.
=Q
Archivos
!omo hemos dicho la mayora de los m)todos de ordenacin e*terna usan la
siguiente estrategia( en primer lugar hacer una pasada a trav)s del archivo a ser
ordenado, dividi)ndolo en blo#ues de tama9o #ue puedan ser almacenados en la
memoria principal, y ordenar estos blo#ues. ,uego intercalar los blo#ues
ordenados haciendo varias pasadas por el archivo creando sucesivamente blo#ues
ordenados cada vez ms grandes, hasta #ue el archivo entero lo est).
'ara la fase de ordenacin interna se usar el m)todo ms rpido seg:n sea la
distribucin de los datos a ordenar. 'ara la fase de intercalacin e*isten varios
m)todos de los cuales trataremos el denominado 0ntercalacin balanceada de 1-
vas.
-na intercalacin balanceada de ']vas utiliza &' archivos au*iliares+ ' archivos
de entrada y ' de salida. Al n:mero ' se lo denomina grado de la intercalacin.
1upongamos #ue tenemos un archivo de Q%%% registros y #ue en memoria slo hay
lugar para $%%%. Deamos como funciona el algoritmo para distintos valores de '.
= 2 8
fase de ordenamiento
,eemos los primeros $%%% registros, R%%%$ . . . R$%%%, los ordenamos y los grabamos
en el archivo A$+ leemos los $%%% registros siguientes, R$%%$ . . . R&%%%

, los
ordenamos y los grabamos en A&+ leemos los registros R&%%$ . . . R=%%%

, los
ordenamos y los grabamos en A$ y as sucesivamente. Al terminar la fase
ordenamiento, obtenemos(
A$( R%%%$ . . . R$%%% R&%%$ . . . R=%%% R@%%$ . . . RE%%% RH%%$ . . . RI%%% RP%%$ . . . RQ%%%
A&( R$%%$ . . . R&%%% R=%%$ . . . R@%%% RE%%$ . . . RH%%% RI%%$ . . . RP%%%
donde cada porcin de $%%% registros est ordenada.
fase de intercalacin
paso
Aplicamos el algoritmo de intercalacin entre A$ y A& .slo los primeros $%%%
registros de cada uno8, y obtenemos en A= los primeros &%%% registros ordenados.
,uego intercalamos los registros del &%%$ al @%%% #ue los pasaremos al archivo
A@, y as siguiendo,
A=( R%%%$ . . . R&%%% R@%%$ . . . RH%%% RP%%$ . . . RQ%%%
@%
Archivos
A@( R&%%$ . . . R@%%% RH%%$ . . . RP%%%
paso "
En este paso, A= y A@ pasan a ser los archivos de entrada y A$ y A& de salida.
A$( R%%%$ . . . R@%%% RP%%$ . . . RQ%%%
A&( R@%%$ . . . RP%%%
paso /
2uevamente A$ y A& son de entrada y A= y A@ de salida.
A=( R%%%$ . . . RP%%%
A@( RP%%$ . . . RQ%%%
paso 2
A$( R%%%$ . . . RQ%%%
0bteniendo el archivo entero ordenado.
= 2 :
fase de ordenamiento
A$( R%%%$ . . . R$%%% R=%%$ . . . R@%%% RH%%$. . . RI%%%
A&( R$%%$. . . .R&%%% R@%%$ . . .RE%%% RI%%$ . . . RP%%%
A=( R&%%$ . . . R=%%% RE%%$ . . . RH%%% RP%%$ . . . RQ%%%
fase de intercalacin
paso
A@( R%%%$ . . . R=%%%
@$
Archivos
AE( R=%%$ . . . RH%%%
AH( RH%%$ . . . RQ%%%
paso "
A$( R%%%$ . . . RQ%%%
Demos #ue para '_& se necesitaron cuatro pasos de intercalacin, mientras #ue
para '_= slo han hecho falta dos. ,a cantidad de pasos de intercalacin tambi)n
depende por supuesto de la cantidad de elementos #ue pueden caber
simultneamente en la memoria principal. 1i el archivo es de tama9o 2 y en
memoria se pueden almacenar hasta registros simultneamente, en la fase de
ordenamiento se construirn 1 _ `2;a subarchivos ordenados .,a notacin `*a
indica el menor entero mayor o igual #ue *8. A mayor 1, o sea a menor , y menor
grado de intercalacin mayor es la cantidad de pasos en la fase de intercalacin y
por consiguiente el proceso ser ms lento.
/urante cada paso de intercalacin el n:mero de subarchivos #ue se obtienen es
apro*imadamente el n:mero de subarchivos del paso anterior dividido el grado de
la intercalacin .'8. Adems, en cada paso casi todos los subarchivos ordenados se
alargan por un factor igual al grado de la intercalacin. 1i 1 es de la forma '
6
, el
n:mero de subarchivos de salida de cada paso de intercalacin es e*actamente el
n:mero de subarchivos de entrada al paso dividido '. !ada subarchivo de salida es
' veces de largo de cada subarchivo de entrada. 1i la fase de ordenamiento interno
produce 1 subarchivos para ser intercalados, entonces una intercalacin
balanceada, re#uerir 0.log'18 pasos de intercalacin.
Cortes e Control
1upongamos #ue disponemos de un archivo cuyos campos son( n:mero de cliente,
n:mero de factura e importe de la factura. Es obvio #ue el mismo n:mero de
cliente podr aparecer varias veces en el archivo, en realidad aparecer tantas
veces como facturas tenga. 1abiendo #ue el archivo est ordenado por n:mero de
cliente, #ueremos construir a partir de )l otro archivo #ue tenga slo un registro
por cada cliente. ,os campos de los registros de este :ltimo archivo son n:mero de
cliente e importe total.
El archivo est formado por grupos de registros #ue tienen el mismo valor de la
clave .en este caso mismo n:mero de cliente8, y cada vez #ue haya un cambio en
el valor de la clave debemos grabar un registro en el archivo nuevo.
@&
Archivos
Archivo E*istente Archivo 2uevo
cliente factura importe cliente importeYtotal
%& =@E P&%.=% %& $=HE.P%
%& HIP =@E.%% %E $%%%.%%
%& IPQ &%%.E% %H I&&.E%
%E =@@ $%%%.%% R
%H =@P E&&.E%
%H IE% &%%.%%
R

1e sugiere al lector #ue realice cuidadosamente el seguimiento del siguiente
algoritmo(
#$nc%de &std$o.h'
#$nc%de &con$o.h'
#$nc%de &str$n/.h'
FILE *a!r$r();
"o$d /enerararch(FILE *f, FILE *f7);
strct re/I7
( char c%$ente0>3;
char factra0D3;
do!%e $mporte;
-;
strct re/I9
( char c%$ente0>3;
do!%e $mporteItota%;
-;
ma$n()
( FILE *f, *f7;
f = a!r$r();
f7 = a!r$r();
/enerararch(f, f7);
fc%ose(f);
fc%ose(f7);
-
"o$d /enerararch(FILE *f, FILE *f7)
( strct re/I7 ";
strct re/I9 "7;
char c%$enteIant0>3;
fseeU(f, 2, 2);
fseeU(f7, 2, 2);
fread(H", s$Beof(re/I7), 7, f);
.h$%e( 5feof(f))
( "7.$mporteItota% = 2;
@=
Archivos
strcp8(c%$enteIant, ".c%$ente);
.h$%e (5feof(f) HH (strcmp (".c%$ente, c%$enteIant) == 2))
( "7.$mporteItota% = "7.$mporteItota% 4 ".$mporte;
fread(H", s$Beof(re/I7), 7, f);
-
strcp8("7.c%$ente, c%$enteIant);
f.r$te(H"7, s$Beof(re/I9), 7, f7);
-
-
0bservar #ue hay una estructura Ahile para recorrer todo el archivo y otra para
recorrer cada grupo de clientes. ,os algoritmos de cortes de control se usan muy
frecuentemente en la programacin de sistemas comerciales, sobre todo en salida
impresa. Keneralmente cada vez #ue se procesa un grupo se re#uiere un subtotal y
al final de todo el proceso un total general. 1upongamos #ue del archivo anterior
#ueremos obtener el siguiente listado.
DETALLE DE VENTAS
Cliente Factura Importe
02 345 820.30
!8 345.00
!8" 200.50
T#TAL CLIENTE 02 $345.80
05 344 $000.00
T#TAL CLIENTE 05 $000.00
0 348 522.50
!50 200.00
T#TAL CLIENTE 0 !22.50
T#TAL VENDID# 208.30
#$nc%de &std$o.h'
#$nc%de &con$o.h'
#$nc%de &str$n/.h'
FILE *a!r$r();
"o$d %$stararch(FILE *f);
strct re/I7
( char c%$ente0>3;
char factra0D3;
@@
Archivos
do!%e $mporte;
-;
ma$n()
( FILE *f;
f = a!r$r();
%$stararch(f);
fc%ose(f);
-
"o$d %$stararch(FILE *f)
( strct re/I7 ";
char c%$enteIant0>3;
do!%e tota%Ic%$ente;
do!%e tota%;
pr$ntf()<%$entes Importe));
tota% = 2;
fread(H", s$Beof(re/I7), 7,f);
.h$%e(5feof(f))
( tota%Ic%$ente = 2;
strcp8(c%$enteIant, ".c%$ente);
pr$ntf()6s), ".c%$ente);
.h$%e (5feof(f) HH (strcmp(".c%$ente, c%$enteIant) == 2))
( pr$ntf()\n6s 6f),".factra, ".$mporte);
tota%Ic%$ente = tota%Ic%$ente 4 ".$mporte;
fread(H", s$Beof(re/I7), 7,f);
-
pr$ntf ()\nWota% c%$ente 6s 6f), c%$enteIant,
tota%Ic%$ente);
tota% = tota% 4 tota%Ic%$ente;
-
pr$ntf()\nWota% "end$do ), tota%);
-
Todos los algoritmos para generar listados con cortes de control tienen una forma
similar. 1i los registros tuvieran adems un campo vendedor y el archivo estuviera
ordenado por vendedor y por cada vendedor por cliente, podramos obtener un
corte por vendedor y otro por cliente. /eberamos agregar una variable
oa!_vendedor .para totalizar las ventas de cada vendedor8 y otra vendedor_an
.para guardar el cdigo del vendedor anterior8.
'ara poder hacer cortes de control como el enunciado el archivo tiene #ue estar
ordenado de la siguiente forma (

!lave =
!lave &
!lave $
Archivo

@E
Archivos


R
/entro del archivo se repite cada valor de la primer clave, a su vez para valores
iguales de la primer clave, se repiten valores de la clave &, dentro de la clave & se
repiten valores de la clave = y as siguiendo. -n algoritmo para hacer tantos cortes
de control como claves haya, tiene el siguiente formato general(
acciones %.a+
leer primer registro+
Ahile .no fin del archivo8
U acciones $.a+
Ahile ..no fin del archivo8 y .clave$ igual clave$Yanterior88
U acciones &.a+
Ahile ..no fin de archivo8 y .clave$ igual clave$Yanterior8 y .clave& igual clave&Yanterior88
U .
.
.
Ahile ..no fin de archivo8 y .clave$ igual clave$Yanterior8 y .clave& igual clave& Yanterior8 y .....
U procesar registro+
leer pr*imo registro+
.
.
V.
V
aciones &.b+
V
acciones $.b+
V
acciones %.b
0bservar #ue la cantidad de ciclos -hi!e es una ms #ue la cantidad de claves. ,as
acciones !.a, generalmente imprimen un ttulo y dan valores iniciales a las
variables #ue calculan totales de todo el archivo. ,as acciones .a' ".a, etc. dan
valores iniciales a los subtotales de la clave $, clave & , etc respectivamente y
guardan el valor anterior de la clave. ,as acciones del ciclo ms interno son
procesar el registro y leer pr*imo registro. ,as acciones .b' ".b etc., imprimen
los subtotales de la clave respectiva e incrementan los subtotales de un nivel ms
e*terno. <inalmente las aciones !.b imprime los totales generales.
@H
Archivos
Una Aplicacin Con Arc!i"os Y Arre-los
1upongamos #ue, en una -niversidad, el acceso a la biblioteca est controlado por
un lector de tar"etas. !ada alumno posee una tar"eta, #ue debe utilizar para ingresar
a la biblioteca. !ada vez #ue esta tar"eta es insertada en el lector, el programa
controla las entradas, lee las informaciones codificadas en la tar"eta .en particular
matrcula del alumno8. 1i la persona es autorizada, el programa ordena la apertura
de la puerta e inscribe el nombre del alumno en un archivo diario de control. En
este archivo, cara registro contiene el n:mero de la matrcula y aparecen en el
orden de las entradas. 1i un mismo alumno ha entrado varias veces a la biblioteca,
habr en el archivo, varios registros con su matrcula. Al final del da se #uiere un
listado con el n:mero de matrcula y el n:mero de visitas efectuadas. Tener en
cuenta #ue el archivo no est ordenado respecto a matrcula.
Deamos dos posibles soluciones y las venta"as y desventa"as de cada una. 1i la
cantidad m*ima de alumnos #ue visitan diariamente la biblioteca es, digamos,
$%%, podemos definir un arreglo de $%% elementos donde cada elemento tiene dos
campos( matricula y cantidad de visitas. El algoritmo es(
iniciali.ar arreglo+
leer registro+
while %no sea el fin de archivo&
3 buscar la matricula en el arreglo+
si %la encontro&
sumarle a cantidad+
sino
3 agregar la matrcula al arreglo+
asignar a cantidad+
4
leer registro
4
imprimir el arreglo+
Este algoritmo es muy rpido pero tiene la desventa"a de utilizar un arreglo #ue, ya
sabemos, necesitamos a priori determinar su tama9o. El algoritmo anterior sirve
siempre y cuando la cantidad de alumnos distintos #ue visitan la biblioteca
diariamente no supere a $%%.
,a otra forma de resolverlo es ms lenta pero no tenemos restriccin de la cantidad
de alumnos diaria. 0rdenamos el archivo por matrcula, para ello aplicamos el
m)todo de ordenacin balanceada de ']vas+ de esta manera todos los registros
correspondientes a un mismo alumno #uedarn "untos. ,uego aplicamos la t)cnica
de corte de control reci)n estudiada.
e"ercicio
@I
Archivos
codificar el enunciado anterior
Creacin de 3ndices
En la seccin anterior vimos #ue para realizar cortes de control es indispensable
#ue el archivo est) ordenado. Adems un archivo ordenado tiene otras venta"as,
por e"emplo podemos hacer una b:s#ueda binaria en lugar de una secuencial para
encontrar el registro #ue le corresponde a un valor dado de la clave. 'ero mantener
un archivo ordenado es muy costoso por#ue insertar un registro nuevo en el
archivo implica encontrar, en primer lugar, el lugar donde ubicarlo y luego correr
todos los registros siguientes para liberar el espacio re#uerido para la insercin.
Demos, entonces, #ue hay dos alternativas de traba"o( una posibilidad es traba"ar
con el archivo desordenado, esto hace #ue la insercin de un nuevo registro sea
muy rpida ya #ue simplemente debemos agregarlo detrs del :ltimo, pero es muy
lenta la b:s#ueda de un valor de la clave y si necesitamos hacer cortes de control
debemos aplicar alg:n m)todo de ordenacin e*terna #ue generalmente son muy
costosos. 0tra posibilidad es traba"ar con el archivo permanentemente ordenado,
esto tiene venta"as en las b:s#uedas y algoritmos de cortes de control pero se hace
muy lenta la insercin de nuevos registros. Fay una tercer alternativa #ue es
construir archivos ndices. -n archivo ndice es un archivo cuyos registros estn
formados, generalmente, por dos campos, la clave y una referencia al registro en
donde se encuentra la informacin correspondiente a ese valor de la clave en el
archivo de datos.
'rchivo de dao" 'rchivo 9ndice
registro matricula apelYnom califY$ califY& concepto borrado matricula registro
% EHIP . . . . . E&== =
$ E=@E . . . . . E=@E $
& EIPI . . . . . EEHI @
= E&== . . . . . EEHP I
@ EEHI . . . . . EHIP %
E EPQ% . . . . . EIPI &
H EIPQ . . . . . EIPQ H
I EEHP . . . . . EPQ% E
R R
El es#uema anterior corresponde al archivo de alumnos y un archivo ndice
ordenado por matrcula.
-na de las venta"as de un archivo ndice es #ue la adicin de registros es mucho
ms rpida #ue con un archivo de datos ordenado, siempre y cuando el ndice sea
lo suficientemente pe#ue9o para #ue pueda ser almacenado completo en la
memoria principal. !omo la longitud de cada registro del archivo de ndices es
@P
Archivos
pe#ue9a, no es difcil cumplir esta condicin para archivos pe#ue9os, conformados
por unos miles de registros.
-n archivo ndice puede crearse "unto o despu)s de crearse el archivo de datos.
Tambi)n se pueden tener varios archivos ndices, por e"emplo un ndice ordenado
por matrcula y otro por apellido. 1i el archivo de datos y los ndices se crean
simultneamente tenemos(
$. crear los archivos vacos de ndices y de datos
&. cargar el archivo de ndice en la memoria
=. actualizar el archivo de datos y el ndice
@. escribir el archivo ndice de la memoria al disco despu)s de usarlo
Creaci%n &e Lo" 'rchivo" de &ao" e >ndice
Tanto el archivo de ndice como el de datos se crean como archivos vacos.
Car#a &e! >ndice En La *emoria
1e supone #ue el archivo de ndice es lo suficientemente pe#ue9o para caber en la
memoria principal, de tal manera #ue se define un arreglo IN&ICE para
almacenar los registros del archivo de ndices. 'or consiguiente la carga de este
archivo consiste, simplemente, en leer el archivo ndice en el arreglo.
'cua!i(ar E! 'rchivo &e &ao" ? E! >ndice
Agregar un registro nuevo al archivo de datos re#uiere #ue tambi)n se agregue un
registro al archivo de ndices. El registro con la informacin se agrega al final del
archivo de datos y se inserta en el lugar adecuado .para mantener el orden8 un
registro con la clave y la referencia en el arreglo de ndices. ,a eliminacin de
registros implica la eliminacin de todas las referencias a ese registro en un
sistema de archivos. 1i se modifican campos #ue son claves en los archivos
ndices ser necesario volver a ordenarlos, si los campos modificados no forman
parte de la clave los archivos ndices no se modifican.
E"cribir E! 'rchivo >ndice &e La *emoria '! &i"co &e"pu@" &e U"ar!o
!uando se termina el procesamiento de un archivo con ndices es necesario
escribir el arreglo IN&ICE de vuelta en el archivo de ndices.
)ecuperaci%n &e La Informaci%n
1i debemos emitir un listado ordenado por la clave del ndice, debemos( leer el
archivo ndice en un arreglo, recorrer el arreglo y obtener la informacin del
registro del archivo de datos indicado en el ndice.
@Q
Archivos
1i debemos obtener un listado por un campo #ue no es la clave del archivo ndice,
por e"emplo por nombre y apellido, debemos(
$. a partir del archivo de datos construir un arreglo IN&ICE #ue contenga los
valores de la nueva clave y el registro #ue le corresponde en el archivo de datos
&. ordenar el arreglo IN&ICE
=. recorrer el arreglo y obtener la informacin del registro del archivo de datos
indicado en el ndice
>ndice" &ema"iado" Arande" =ara Ber '!macenado" En *emoria
,as t)cnicas analizadas y, por desgracia, muchas de las venta"as #ue presentan,
estn su"etos a la suposicin de #ue el archivo de ndices es lo suficientemente
pe#ue9o para cargase por completo en memoria. !uando el ndice es demasiado
grande para poder almacenarse en la memoria principal, se deben usar t)cnicas
para crear ndices #ue escapan al mbito de este te*to.
$%ercicio adicionales
Agregar de archivos de te*t
$ y I de cranAell
"ava $%.$, $%.&, $%.=
E%

También podría gustarte