You are on page 1of 73

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.

Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PLAN GENERAL DEL CAPITULO

4.1 Un archivo como secuencia de bytes


4.2 Estructuras de campos
4.2.1 Mtodo 1:Fijar la longitud de los campos
4.2.2 Mtodo2: Comenzar cada campo con un indicador de longitud
4.2.3 Mtodo 3: Separar los campos con delimitadores
4.3 Lectura de una secuencia de campos
4.4 Estructuras de registros
4.4.1 Mtodo 1:Hacer los registros de una longitud predecible
4.4.2 Mtodo 2: Comenzar cada registro con un indicador de longitud
4.4.3 Mtodo 3: Usar un segundo archivo para mantener informacin sobre las direcciones
4.4.4 Mtodo 4: Colocar un delimiLztdor al final de cada registro
4.5 Una estructura de registros que usa u n indicador de
longitud
4.6 Mezcla de nmeros y caracteres: Uso de u n vaciado
hexadecimal
4.7 Lectura de registros de longitud variable de u n archivo
4.8Extraccin de registrospor llave: formascannicaspara
llaves
4.9 Una bsqueda secuencial
4.10 Evaluacin del desempeo de la bsqueda secuencial
4.11 Mejora deldesempeo delabsquedasecuencial:manejo
de registros en bloques
4.12 Acceso directo
4.13 Eleccin de una estructura y una longitud de registro
4.14 Registros de encabezado
4.15 Acceso y organizacin de archivos
Programas en C
Programas en Pascal

4.1

UN ARCHIVO COMO SECUENCIA DE BYTES


Cuando se construyen e s t r u c t u r a s d e archivos se impone u n orden
sobre los datos. En este capitulo s e investigarn l a s mltiples formas
q u e puede t o m a r este orden. Se comienza examinando el caso desde l a
base: un archivo organizado como u n a secuencia d e bytes.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

UN ARCHIVO COMO SECUENCIA DE BYTES

91

Suponga que el archivo que se construye contiene informacin


sobre nombresy direcciones. Enlafigura4.1 semuestrael pseudocdigo
que describe un programa que recibe nombres y direcciones del teclado,
y los transcribe como una secuencia de bytes consecutivos a un archivo
con nombre lgico SALIDA.
Las realizaciones de este programa, tanto en C como en Pascal,
llamadas escribe se c.^ y escribesec.pas, se presentan al final de este
captulo. El lector debe digitar este programa, ya sea en C o en Pascal,
compilarlo y ejecutarlo. Se usa como base de numerosos experimentos,
y se podr comprender mejor las diferencias entre las estmcturas de
archivos que se estn analizando si se llevan a cabo los experimentos.
Los siguientes nombres y direcciones se usan como entrada al
programa:
John A m e s

Alan Mason

123 Maple

90 Eastgate
Ada, OK 74820

Stillwater, OK 74075

Cuando se lista el archivo de salida en la pantalla de la terminal, se ve


lo siguiente:

PRCGRAMA: escribesec

Lee el nombre del archivo de salida y lo abre con el nombre


l6gico SALIDA
Lee APELLIDO
mientras (APELLIDO tenga longitud > 0 )
lee NOMBRE, DIRECCION, CIUDAD, ESTADO y CP
escribe
escribe
escribe
escribe
escribe
escribe

APELLIDO
NOMBRE
DIRECCION
CIUDAD
ESTADO
CP

en
en
en
en
en
en

el
el
el
el
el
el

archivo
archivo
archivo
archivo
archivo
archivo

SALIDA
SALIDA
SALIDA
SALIDA
SALIDA
SALIDA

Lee APELLIDO
fin mientras

cierra SALIDA

FIGURA 4.1- Programa para escribir un archivo de nombres y


direcciones como una secuencia de bytes.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

92

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS D E . .

El programa transcribe la informacin al archivo tal como se


especific: como una secuencia de bytes que no contiene informacidn
adicional. Pero al cumplir con las especificaciones,el programa creaun
problema de tipo "Humpty-Dumpty al revsn.Unavez que se pone toda
la informacin junta como una secuencia de bytes, no hay forma de
separarla de nuevo.
Lo que sucede es que se h a 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 "John Amesn o "123 Maple".
Cuando se trabaja con archivos, se denomina campos a esos agregados
fundamentales. Un campo es la unidad de informacin lgicamente
significativa mspequeria en un archivo.
Un campo es una idea lgica, una herramienta conceptual. Un
campo no necesariamente existe en algn sentido fsico,pero aun as es
importante parala estmctura del archivo. Cuando lainformacin sobre
el nombre y la direccin se transcribe como una secuencia de bytes no
diferenciables, se pierde el rastro de los campos que le dan significado
a la informacin. Es necesario organizar el archivo de manera que la
informacin se mantenga dividida en campos.

'

4.2
ESTRUCTURAS DE CAMPOS
Hay muchas formas de aadir estmctura a los archivos para mantener
la identidad de los campos. Los tres mtodos m4s comunes son:
O Forzar que los campos tengan una longitud predecible;
O Comenzar cada campo con un indicador de longitud, y
O Colocar un delimitador al final de cada campo para separarlo del
siguiente.

No se 11ck.n mniundir los t6minos campo y regietro mn los significados que algunos
lenkmajes dr programaei6n les han dado, incluso Pnwnl. En Psscnl. un registra es una

estructura de datos apegada que puede contener miembms de tipos diferentes, donde
a cada miembro se le denomina campo. Como se ver& con frecuencia hay una correspondencia directa entre esas definiciones de los t6minos y los campos y registms que
se usan en los archivos. Sin embargo, los terminas campo y registro, coma se emplean
en el texto, tienen significadas mucha mds generales que los que tienen en Pascal.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

4.2.1 METODO 1:FIJAR LA LONGITUD DE LOS CAMPOS

La longitud de los campos vara en nuestro archivo de ejemplo. Si se


fuerza que los campos tengan longitudes predecibles, entonces se pueden recuperar del archivo con s610 contar hasta el final del campo. Se
puede definir una estmctura en C o un registro en Pascal para que tenga esos campos de longitud fija, como se muestra en la figura 4.2.
Con esta clase de estructura de campos de longitud fija la salida
cambia, de modo que se ve como se muestra en la figura 4.3(a). Basta
con aritmdtica simple para poder recuperar los datos en tdrminos de los
campos originales.
Una desventaja obvia de este enfoque es que alagregar el relleno
requerido para llevar los campos a una longitud fija, el archivo crece
mucho. En lugar de usar cuatro bytes para almacenar el apellido Ames,
se usan diez. Tambidn se pueden presentar problemas con datos que
sean tan grandes que no quepan en el espacio asignado. Este segundo
problema se resolvera dando a los campos longitudes lo suficientemente
grandes como para cubrir todos los casos, pero esto agravara an ms
el problema de espacio desperdiciado en el archivo.
Debido a estas dificultades, el enfoque de campos fijos para la
estructuracin de datos con frecuencia resulta inapropiado para datos
que inherentemente tienen campos de longitud muy variable, como
nombres y direcciones. Pero hay tipos de datos para los cuales los campos de longitud fija son muy apropiados. Si cada campo tiene una longitud fija, o con poca variacin, una buena solucin es emplear una
estructuraque consistaen una secuenciacontinuade bytes organizados
en campos de longitud fija.

En C:

En Pascal:

struct {
char apellido [lo];
char nombre [lo];
char direccibn [l51:
char ciu&d[l5J :
char estado[2];
char cpr91:
1 conj-de-campos;

m E
conj-de-campos
apellido :
nombre
:
direccin :
:
ciudad
estado
:
CP
END;

= EECOR
packed array
packed array
packed array
packed array
packed array

[l. .lo]
[l.. 10)
[l.,151
[l.,151
[1..21

: packed array [l.. 91

of
of
of
of
of

char;
char;
char;
char;
char;

of char:

FIGURA 4.2 Registros de longitud ja.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

94

CONCEPTOS FUNDAMENTALE5 DE ESTRUCTURAS D E . .

Longiiud de
los campos

10

1-

Datos: Ames

15

10
I

John

15
I

123 Maple
(a)

Stillwater

2
I l

OK74075

10

I
Mason

04AmesO4John09123 Maple 1 0 S t i l l w a t e r OiOK057407505Mason04Alanl190 E a s t g a t e

...

...

(b)
A m e s J o h n ; 1 2 3 Maple; S t i l l w a t e r ; o K i 4 0 7 5 ; M a s " ; A l a n 9 0 E a s t g a t e ; A d a ; 0 K ; 7 4 8 2 0

(e)

FIGURA 4.3 -Tres mtodos para la organizacin de estructuras de


campos. (a) Campos de longitud fda. (b) Cada campo se inicia con
un indicador de longitud. (c) Los campos se separan con delimitadores.

4.2.2 METODO 2: C O M E N 7 m CADA CAMPO CON UN


INDICADOR DE LONGITLTD
Otra forma de contar hasta el final de un campo es almacenar su
longitud delante del campo, como se ilustra en la figura 4.3(b). Si los
campos no son demasiado largos (longitudes de menos de 256 bytes), es
posible almacenar la longitud en un solo byte al inicio de cada campo.

4.2.5 METODO 3: SEPARAR LOS CAMPOS CON


DELIMITADORES
Para preservar la identidad de los campos, Bstos tambikn se pueden
separar con delimitadores. Todo lo que se necesita hacer es elegir algn
carcter especial que no aparezca como un carcter legtimo dentro de
un campo e insertar ese carcter dentro del archivo luego de escribir
cada campo.
La eleccin del carcter delimitador es muy importante, ya que
debe ser un carcter que no se confunda con lo que se est procesando.
Por ejemplo, el carcter coma seraunamalaeleccin paraeste archivo,
porque las comas aparecen con frecuencia como caracteres legales
dentro de un campo de direccin. En esta seccin se usar el carcter
de barra vertical como delimitador, de modo que el archivo aparece
como en la figura 4.3(c). Se debern modificar los programas originales
para secuenciasde bytes,escribesec.c y escribesec.pus (que se encuentran
al final del captulo), de forma que coloquen un delimitador despuks de
cada campo. s e usa este formato de campo delimitado en los siguientes
ejemplos de programas.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

LECTURA DE UNA SECUENCIA DE CAMPOS

4.3

-LECTURA DE UNA SECUENCIA DE CAMPOS


Con lasversiones modificadas de escribe se c.^ y escribesec.pas, que usan
delimitadores para separar los campos, se puede escribir un programa
llamado leesec, que lee l a secuencia de bytes y la divide en campos. E s
conveniente concebir el programa en dos niveles, como se muestra en
la descripcin en pseudocdigo de la figura4.4. El nivel ms externo del
Definicin de constante: DELIMITADOR

'I

PROGPAMA: leesec
Lee el nombre del archivo de entrada y lo abre como ENTRWA

inicia CONT-CAMPOS
LONG-CAMPO := leecampo(ENTRADA, CONTENIDO-CAMPO);
mientras ( LONG-CAMPO > O)
incrementa el CONT-CAMPOS
escribe CONT-CAMPOS y CONTENIDO-CAMPO en la pantalla
LONG-CAMPO :- leecampo (ENTRADA, CONTENIDO-CAMPO) ;
fin mientras
cierra ENTRADA
fin PROGRAMA
FUNCION: leecampo (ENTRADA, CONTENIDO-CAMPO)
inicia 1
inicia CH
mientras (no EOF (ENTRADA) y CA distinto de DELIMITADOR)
lee un carcter de ENTRADA en CAR
incrementa 1
CONTENIDO-CAMPO[I] := CA
fin mientras
devuelve(1ongitud del campo que se ley)
fin FUNCION

FIGURA 4.4 Programa que lee campos de un archivo y los des.


pliega e n la pantalla.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

96

CONCEPTOS FUNDAME~ALESDE ESTRUCTURAS D E . .

programa abre el archivo y despu~sllamaalafuncinleecampo0,


hasta
que esta devuelve un campo con longitud cero, lo cual indica que no
existen mds campos por leer. La funcin leecampo0, a su vez, trabaja
a lo largo del archivo, carcter por carActer, recolectando caracteres
dentro de un campo hasta que encuentra un delimitador o el fin del
archivo. La funcin devuelve el nmero de caracteres que se encontraron
en el campo. Las realizaciones de leesec, tanto en C como en Pascal, se
incluyen con los programas al final del capitulo.
Cuando este programa se ejecuta, usando laversin del archivo con
campos delimitados que contienelos datos de John Amesy Alan Mason,
la salida se ve as:
Campo
Campo
Campo
Campo
Campo
Campo
Campo
Campo
Campo
Campo
Campo
Campo

# 1:
# 2:
# 3:
# 4:
# 5:
# 6:
# 7:
# 8:
# 9:

Ames

John
123 Maple
Stillwater
OK
74075
Mason
Alan
90 Eastgate
# 10: Ada
# 11: OK
# 12: 74820

Es evidente que ahora se preserva la nocin del campo conforme se


almacenan y extraen esos datos. Pero todava falta algo. En realidad
este archivo no se concibi como una seceuncia de campos; de hecho los
campos necesitan agruparse en conjuntos. Los primeros seis campos
constituyen un conjunto asociado con alguien llamado John Ames; los
siguientes seis son un conjunto asociado con Alan Mason. A estos conjuntos de campos se les llama registros.

-ESTRUCTURAS DE REGISTROS
4.4

Un registro puede definirse como un conjunto de campos agrupados


bajo la perspectiva de un archivo de nivel ms alto & organizacin en
un archivo. Al igual que la nocin de campo, un registro es otra herramienta conceptual. Es otro nivel de organizacin que se impone sobre
losdatosparapreservar susignificado. Losregistrosnonecesariamente

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

ESTRUCTURAS DE REGISTROS

97

existen en el archivo en un sentido fsico; sin embargo, constituyen una


nocin lgica importante incluida en la estructura del archivo.
Presentamos a continuacin algunos de los mtodos que se usan
con mayor frecuencia para organizar un archivo en registros:
O

Exigir que los registros sean de longitud predecible. Esta


longitud puede medirse en trminos de bytes o en trminos del
nmero de campos.

Comenzar cada registro con un indicador de longitud que seale


el nmero de bytes que contiene.

Usar un segundo archivo para mantener informacin de la


direccin del byte de inicio de cada registro.

D Colocar un delimitador al final de cada registro, para separarlo


del siguiente.

4.4.1 METODO 1: HACER LOS REGISTROS DE UNA


LONGITUD PREDECIBLE
Hacer un registro de longitud predecible permite mantener la cuenta
dentro del registro. Cuando el conteo alcanza una cantidad predeterminada, se sabe que el registro se h a leido por completo; cualquier
lectura adicional conducira al siguiente registro. Este mtodo para
reconocer registros es anlogo al primer mtodo analizado para hacer
reconocibles los campos, que implicaba fijar l a longitud del campo. La
diferencia importante radica en que, cuando se cuenta a lo largo de un
registro se eligen las unidades de conteo; se pueden contar bytes o
campos.
CONTEO DE BYTES: REGISTROS DE LONGITUD FIJA. Un archivo
con registros de l o n g i t u d f k es aquel cuyos registros contienen todos el
mismo nmero de bytes. Como se ver en los captulos siguientes, las
estructuras de registros de longitud fija son uno de los mtodos ms
usados para organizar archivos.
La estructura de C conjunto-de-campos (o el RECORD de Pascal
del mismo nombre) que se definid en el anlisis de los campos de
longitud fija en realidad es un ejemplo de un registro de longitud f?ja,
as como un ejemplo de campos delongitud fija. Se tiene un nmero fijo
de campos, cada uno con una longitud predeterminada, los cuales se

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

98

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

combinan para hacer un registro de longitud fija. Esta clase de estructura de campos y registros se ilustra en l a figura 4.5(a).
Sin embargo, es importante comprender que fijar el nmero de
bytes en un registro no implica de ninguna manera que los tamaiios o
el nmero de campos deban ser fijos. Los registros de longitud fija se
usan con mucha frecuencia como recipientes para guardar un nmero
variable de campos de longitud variable. Tambi6n e s posible mezclar
campos de longitudfijay variable dentro de un registro. Lafigura4.5(b)
muestra cmo pueden colocarse campos de longitud variable en un
registro de longitud fija.

CAMPOS DE C O N T E O . En lugar de especificar quecada registro en un


archivo contiene un nmero fijo de bytes, se puede especificar que
contendr un nmero fijo de campos. Esta es la forma ms simple de
organizar los registros en el archivo de nombres y direcciones que se
analiz con anterioridad. El programa escribesec pide seis partes de
informacin para cada persona, de tal forma que en el archivo hay seis
campos contiguos por cada registro (Fig. 4 . 5 ~ )Se
. podra modificar
leesec para reconocer los campos por un simple conteo de campos
mdulo seis, sacando l a informacin delimitada del registro a la
pantalla cada vez que el conteo empieza de nuevo.

Ames

John

123 Maple

Stillwater

OK74075

Mason

Alan

90 Eastgate

Ada

OK74820

Ames : J a h n : 123 Maple : Stillwater O K :74075 :e-Unused space+

Mason : Alan 190 Eastgate : A d a : OK 74820 : -Unusedspace--+

Ames : J o h n : 123 Maple : Stillwater : OK m 7 5 ; M a c o n ; Alan ; 90 Eastgate l Ada : OK .

FIGURA 4.5 Tres formas de volver constantes y predeoibles laa


longitudes de los registros. (a) Conteo de bytes: registros de
longitud fija con campos de longitud fija. (b) Conteo de bytes:
registros de longitud fiia con campos de longitud variable. ( c )
Conteo de campos: seis campos por registro.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

99

ESTRUCTURAS DE REGISTROS

4.4.2 METODO 2: COMENZAR CADA REGISTRO CON UN


INDICADOR DE LONGITUD
Se sabe cuntos bytes hay en los registros de longitud fija porque l a
longitud del registro es una constante predeterminada a lo largo del
archivo. Tambin se puede transmitir l a longitud de los registros, y
hacerlos reconocibles, comenzando cada registro con un campo que
contenga un nmero entero que indique cuntos bytes hay en el resto
del registro (Fig. 4.6a). Este es un mtodo muy comn en el manejo de
registros de longitud variable. Se examinan con mayor detalle en l a
siguiente seccin.
4.4.3 METODO 3: USAR UN SEGUNDO ARCHIVO PARA

MANTENER INFORMACION SOBRE LAS DIRECCIONES


Se puedeemplear un segundo archivo dendice paramantenerinformacin sobre la distancia en bytes de cada registro en el archivo original.
La distancia en bytes permite encontrar el comienzo de cada registro
sucesivo y calcular su longitud. Se busca la posicin de un registro en
el ndice y despus se alcanza el registro dentro del archivo de datos. La
figura 4.6(b) ilustra este mecanismo de dos archivos.
40Ames:John:l23 Maple:Stillwater:OK~74075:36Masan:Alan:90Eastgate .

datos

. .

ndice
@)

FIGURA 4.6 Estructuras de registros para registros de longitud


variable. (a) Se inicia cada registro con un indicador de longitud.
(b) Se usa un archivo de ndice para mantener la informacin de las
direcciones de los registros. (c) Se coloca el delimitador 'W' al final
de cada registro.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

100

CONCEPTOS FUNDAMENTALES DE ESTRUCTURXS DE

.. .

4.4.4 METODO 4: COLOCAR UN DELIMITADOR AL FINAL

DE CADA REGISTRO
Esta es la opcin que, en el nivel de registro, es por completo similar a
la solucin que se dio para distinguir los campos en el programa del
ejemplo que se desarroll. Lamarcade fin de lnea seusa frecuentemente
como un delimitador de registro (la pareja de retorno de carro y avance
de lnea o, en sistemas UNIX, sloun carcter de avance de lneaC\n')).
En la figura 4.6(c) se usa un carcter '' como delimitador de registro.

4.5
UNA ESTRUCTURA DE REGISTROS QUE USA UN
INDICADOR DE LONGITUD
Ninguno de estos enfoques para preservar la idea de un registro dentro
de un archivo es apropiado en todas las situaciones. La seleccin de un
mtodo de organizacin del registro aepende de la naturaleza de los
datos y de lo que se necesite hacer con ellos. Se comenzar examinando
unaestructurade registro queusaun campodelongitudal principio del
registro. Este enfoque permite preservar l a variabilidad de la longitud
de los registros, inherente al archivo de secuencia de bytes inicial.
Se llamar escribereg al programa que construye esta nueva
estructura de registros de longitud variable. El conjunto de programas
que se presenta al final del captulo contiene las versiones de este
programa en C y en Turbo Pascal. La realizacin de este programa
requiere, en parte, modificar el programa escribesec que se hizo con
anterioridad en este capitulo, aunque tambin implica resolver algunos
problemas nuevos:
O

Si se quiere colocar un indicador de longitud al principio de cada


registro (antes de cualquier campo) se debe conocer la suma de
las longitudes de los campos de cada registro antes de empezar a
transcribir el registro al archivo. Se necesita acumular el
contenido completo de un registro en un buffer antes de
escribirlo.
O En qu forma debe transcribirse el campo de longitud del
registro al archivo? Como un entero binario? Como una serie
de caracteres ASCII?
Conforme se trabaja con archivos, se recurre una y otra vez al
concepto de manejo de buffers. En el caso deescribereg, el buffer puede

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

UNA ESTRUCTURA DE REGISTROS QUE USA..

lee APELLIDO
mientras ( APELLIDO tenga longitud > O )
asigna la longitud de la cadena en BUFFER a cero
concatena: BUFFER + APELLIDO + DELIMITADOR
mientras ( existan campos por leer para el registro )
lee el CAMPO
concatena: BUFFER + CAMPO + DELIMITADOR
fin mientras
escribe la longitud de la cadena de BUFFER al archivo
escribe la cadena de BUFFER al archivo
lee APELLIDO
fin mientras

FIGURA 4.7 -Lgica del programa principal d e escribereg.


ser un simple arreglo de caracteres dentro del cual se colocan los
campos y sus delimitadores, conforme se recolectan. Para reiniciar la
longitud del buffer en cero y aiadir informacin al buffer se puede
emplear el ciclo lgico que se proporciona en la figura 4.7.
La pregunta sobre cmo representar la longitud del registro es un
poco msdifcil. Una opcin sera escribir lalongituden forma d e u n entero binario antes de cada registro. Esta es una solucin natural en C,
ya que no existe el problema de conversin de la longitud del registro
a forma de caracteres. Tambin desde el punto de vista conceptual es
interesante, ya que ilustra el uso de un campo binario de longitud fija
en combinacin con campos de caracteres de longitud variable.
Aunque se podra dar esta misma solucin en una realizacin en
Pascal, es preferible explicar algunas diferencias importantes entre C
y Pascal:

A diferencia de C, Pascal convierte automticamente los enteros


binarios en representaciones de caracteres de esos enteros, si es
que se escriben en un archivo de texto. En consecuencia, no
existe el problema de convertir la longitud del registro a forma
de caracteres: esto sucede automticamente.
D En Pascal, un archivo se define como una secuencia de
elementos de un solo tipo. Ya que se tiene un archivo de cadenas
de caracteres d e longitud variable, el tipo natural del archivo es
el de carcter. Se pueden almacenar enteros de dos bytes en el
archivo, pero entonces se deben dividir en sus valores de bytes
constituyentes y convertirlos con la funcin CHRO. Sin embargo,
O

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

102

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

40 Ames

; John 1

Eastgate

123 Maple

: Ada: OK ( 74820:

Stillwater

; OK 1

74075

36 Mason

I Alan 1 90

FIGURA 4.8 Registros precedidos por campos de longitud de registro


en forma de caracteres.

es mucho ms sencillo dejar que Pascal efecte la conversin


automtica de la longitud a l a forma de carcter.
En sntesis, lo ms fcil en C es almacenar los enteros en el archivo
como campos de dos bytes de longitud fija que contengan enteros. En
Pascal es msfcil usarlaconversin automtica deenteros acaracteres
para los archivos de texto. El diseo de la estructura de archivos
siempre es un ejercicio de flexibilidad. Ninguno de estos enfoques es
correcto; el buen diseo consiste en elegir el enfoque ms apropiado
para el lenguaje y ambiente determinados de computacin. En los
programas incluidos al final del captulo se desarrolla la estmctura de
registros de las dos formas estudiadas, usando campos de longitud
entera en C y representaciones de caracteres en Pascal. La salida de la
realizacin en Pascal se muestra en la figura 4.8. (La salida pasa a
la siguiente lnea despus de 64 caracteres.) En cada registro hay ahora
un campo de longitud del registro que precede a los campos de datos.
Este campo est delimitado por un espacio. Por ejemplo, el primer
registro (para John Ames) contiene 40 caracteres, contando desde la
primera'A'en"Ames"hastaelde1imitadorfinal despusdeU74075",as
que los caracteres ' 4 ' y 'O' se colocan antes del registro, seguidos por un
espacio.
Antes de examinar l a salida de la versin de escribereg en C, donde
se usan enteros binarios para las longitudes de registro, es necesario
revisar el uso del vaciado hexadecimal para poder interpretar la parte
que no tiene caracteres.

4.6
MEZCLA DE NUMEROS Y CARACTERES:
USO DE UN VACIADO HEXADECIMAL
Los vaciados hexadecimales permiten examinar dentro de un archivo
los bytes reales almacenados. Por ejemplo, considrese la informacin
referida a la longitud de registro en la salida del programa en Pascal

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

MEZCLA DE NUMEROS Y CARACTERES...

Valor decimal
del nmero

Valores hexadecimales almaceForma en


nados e n bytes caracteres ASCII
'4'

'O'

FIGURA 4.9 El nmero 40, almacenado como caracteres ASCII.

que se examin anteriormente. Lalongitud del registro Ames, que es el


primero del archivo, es de 40 caracteres, incluyendo los delimitadores.
En la versin Pascal deescribereg, donde se almacen la representacin
de caracteres ASCII para este nmero decimal, los bytes reales almacenados dentro del archiuo se ven como en la representacin de la figura
4.9.
Como se puede observar, no es lo mismo el nmero 40 que el conjunto de caracteres '4' y 'O'. El valor hexadecimal del entero binario 40
es 0x28; los valores hexadecimales de los caracteres '4' y 'O' son 0x34 y
0x30. (Se est empleando la convencin del leng taje C para identificar
nmeros hexadecimales, mediante el uso del prefijo Ox.)Asi, cuando se
almacenaun nmero en formaASCI1, sonlosvaloreshexadecimalesde
los caracteres ASCII los que van dentro del archivo, y no el valor
hexadecimal del nmero mismo.
En la realizacin en C se elige representar l a longitud del campo
para cada registro como un entero corto, en lugar de hacerlo con
caracteres ASCII. Esto tiene dos ventajas:
1. Se puede representar nmeros ms grandes con un entero de
dos bytes que con dos bytes ASCII (32767 contra 99).
2. No se necesita traducir la longitud del registro de ASCII a
entero, cuando se pretende usarla como un entero.
La figura 4.10 muestra la representacin en bytes del nmero 40
almacenado como un entero (a esto se le llama almacenamiento del

Valor decimal
del nmero

Valores hexadecimales almaceForma en


nados e n bytes caracteres ASCII

FIGURA 4.10 El nmero 40, almacenado como un entero corto.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

104

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS D E . .

nmero en forma binaria, aun cuando usualmente se considera a la


salida como un nmero hexadecimal). Ahora el valor hexadecimal
almacenado en el archivo es el delnmero mismo. Loscaracteres ASCII
que se asocian al valor hexadecimal real del nmero no guardan una
relacin obvia con l.
Tomando en cuenta las explicaciones respecto a l a diferencia entre
almacenar nmeros en formade caracteresASCI1y almacenarlos como
cantidades binarias, y considerando que los dos registros tienen longitudes de 40 (valor hexadecimalOx28) y 36 (valor hexadecimalOx24),
la versin del archivo que usa enteros binarios para las longitudes de
registro, en la pantalla de una terminal, se vera asi:
( A m e s 1 John

-Espacio,

: 123 Maple : Stillwater : OK 174075 15Mason : Alan : 90 Eastqate ...


ya que '\O' no e s imprimible
0x28 es el cdigo ASCII de '('

fEspaoio,
por la miama razn
0x24 es el cdigo ASCII de 'S'

Las representaciones ASCII de los caracteres y nmeros en el


registro real aparecen claras, pero las representaciones binarias de los
campos de longitud se despliegan en forma rara. Ntese tambin que
el orden de los bytes de los digitos binarios est al revs. Se ve "( " en
lugar de " (" para el nmero 40. Antes de analizar esta anomala, se
examinar el archivo en forma distinta, esta vez usando el vaciado
hexadecimal.
Intervalo

O 10 20 30 40 -

F
1F
2F
3F
4F

2800416D
4D61706C
7C4F4B7C
6E7C416C
74657C41

Valores hexadecimales

65737C4A
657C5374
37343037
616E7C39
64617C4F

6F686E7C
696C6C77
347C2400
30204561
487C3734

Valores ASCII

31323320 (.Ames: John J 123


61746572 Maple I Stillwater
4D61736F
OK 174075 :$.Mas0
73746761 n Alan 1 90 Eastqa
3832307C t e 1 k b 1 a< 1 748201

Como se puede observar, el despliegue creado por este programa en


particular de vaciado hexadecimal se divide en tres clases diferentes de
datos. El rea del despliegue con el rtulolnterualo indicalasdistancias
de los bytes, que estn dadas en forma hexadecimal; como cada lnea
contiene 16 (decimal) bytes, el movimiento de una lnea a la siguiente
agrega 0x10 al intervalo.
La parte del vaciado hexadecimal rotulada Valores hexadecimales
contiene el valor hexadecimal de cada byte que se encuentra en el
archivo. El tercer byte tiene el valor 0x41, que es el cdigo ASCII del
carcter 'A'. Cada espacio insertado en el archivo resulta en un bytecon
el valor 0x20, que es el cdigo ASCII para el espacio en blanco.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

..

MEZCLA DE NUMEROS Y CARACTERES:.

105

Examinemos ahora los valores hexadecimales de los bytes que representan nmeros. En algunoscasos, comoen 123,lasrepresentaciones
son cdigos ASCII (Ox31,0~32,0~33);
en otros, como en la longitud de
registro 40 que comienza el archivo, son, en realidad, valores hexadecimales de dos bytes (0x28). Pero el nmero hexadecimal correspondiente a 40 parece ser 0x2800 en lugar de 0x0028. Por qu6 estn
invertidos los bytes?
La respuesta es que este vaciado hexadecimal es el tipo de salida
producida por un computador que almacena los valores de los nmeros
segn un orden de bytes invertido. Para enteros de dos bytes, el byte
menos significativo siempre se guarda en una direccin ms baja que
la del ms significativo. De esta forma, el byte con 0x28 se coloca en una
direccin de memoria que precede a la que se us6 para 0x00. Este orden
invertido tambin se aplica a los enteros largos de cuatro bytes en esas
mquinas. Por ejemplo, el valor hexadecimal del nmero 500 000 000
es OxlDCD6500. Si se transcribe este valor a un archivo en una
mquina VAX, IBM PC, o alguna otra de orden invertido, un vaciado
hexadecimal del archivo creado se ver asi:

No todos los computadores invierten el orden de los bytes en esta


forma. Por ejemplo, las grandes mquinas IBM no lo hacen. Este es uno
de los aspecto de archivos que requieren mucha atencin, si se pretende
quelosvaciadoshexadecimalestengan sentido.Tambin es importante
tener estoen cuenta cuando seintente transferir archivosquecontengan
datos binarios entre dos mquinas que ordenen los bytes de diferente
manera. Ntese que el problema no aparece si se estn empleando
archivos ASCII, donde todos los nmeros son representados como
secuencias de caracteres.
Regresemos al vaciado hexadecimal del archivo de nombres y
direcciones para observar la columna de la extrema derecha. Esta es la
lista de los valores ASCII representados porlosbytes del archivo. Como
se esperaba, los datos colocados en el archivo en forma ASCII aparecen
en esta columna en forma legible, pero existen valores hexadecimales
paralos que no hay representacin ASCII imprimible. El nico de tales
valores que aparece en este archivo es 0x00, pero podra haber muchos
otros. Si se examina el vaciado que contiene el nmero 500 000 000, se
observar que el nico byte imprimible es el que tiene el valor 0x65 ('e').
Este programa de vaciado hexadecimal en particular maneja todos los
dems valores colocando un punto ('.') en la representacin ASCII, para
apartar el lugar para el valor del byte.
El vaciado hexadecimal de esta salida en la versin en C de escribereg muestra cmo esta estmctura de archivo representa una mezcla

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

106

CONCEPTOS FUNDAMEh'TAJXS DE ESTRUCTURAS DE..

interesante de varias de las herramientas organizacionales que se


encuentran a lo largo del libro. En un solo registro se tienen datos tanto
binarios como ASCII. Cada registro consiste en un campo de longitud
fija (el nmero de bytes) y en varios campos de longitud variable
delimitados. Esta mezcla de diferentes tipos de datos y mtodos de
organizacin es normal en las estructuras de archivos reales.

4.7
LECTURA DE REGISTROS DE LONGITUD
VARIABLE DE UN ARCHIVO
Con la estructura del archivo de registros de longitudvariable precedidos
por campos de longitud de registro, es fcil escribir un programa que lea
todo el archivo, registro por registro, desplegando los campos de cada
uno de los registros en la pantalla. La lgica del programa se muestra
en la figura 4.11. El programa principal llama a la funcin toma-reg0
para que traslade los registros a u n buffer; este llamado continahasta
que toma-regO devuelve un valor de O. Una vez que toma-reg0 coloca
el contenido de un registro dentro de un buffer, se pasa el buffer %una
funcin llamada tomacampd). La llamada a toma-campd) implica
una posicin de bsqueda (POS-BUS) en la lista de argumentos. A
partir de POSBUS, toma-campd) traslada los caracteres del buffer
hacia un campo hasta que encuentra un delimitador o se llega al final
del registro. La funcin toma-campd) devuelve la POS-BUS para que
se use en la siguiente llamada. Las realizaciones de leereg, tanto en C
como en Pascal, se incluyen junto con los dems programas al final del
captulo.

4.8
EXTRACCION DE REGISTROS POR LLAVE:
FORMAS CANONICAS PARA LLAVES
Como est claro que la nueva estructura de archivo analizada concibe
un registro como la cantidad de informacin que se lee o escribe, tiene
sentido pensar en extraer slo un registro especfico en lugar de leer el
archivo completo, desplegndolo todo. Cuando se examina un registro
individual, es convenienteidentificarlo con una llave que se base en el
contenidodel registro. Por ejemplo,en el archivodenombresy direcciones
se puede desear tener acceso al "registro Ames", o al "registro Mason",

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

EXTRACCION DE REGISTROS POR LLAVE:

...

PROGRAMA: leereg
abre el archivo de entrada c o m q E N T

inicia POS-BUS con O


LONG-REGISTRO := tom-reg(ARCH-ENT, BUFFER)
mientras (LONG-MGISTRO > O)
LONG-REGISTRO)
POS-BUS := toma-campo(CAMP0, BUFFER, PO-US,
mientras (POS-BUS > O)
escribe CAMPO en la pantalla
POS-BUS := toma-campo (CAMPO,BUFFER, POS-BUS, LOffi-REGISTRO)
fin mientras
LONG-REGISTRO : toma-reg (ARCH-Em, BUFFER)
fin mientras
fin PROGRAMA

FUNCION: t0-reg (ARCH-ENT, BUFFER)


si EOF (ARCH-ENT) entonces devuelve O
lee LONG-REGISTRO
lee el contenido del registro en BUFFER
devuelve LONG-REGISTRO
fin FiJNCION
FUNCION: toma-campo(CAMP0, BUFFER, POS-BUS, LONG-REGISTRO)
si POS-BUS

LONG-REGISTRO entonces devuelve O

t o m un carcter CAR en la POS-BUS del BUFFER


mientras (POS-BUS < LONG-REGISTRO y CAR distinto de DELIMITADOR)
coloca CAR en CAMPO
incrementa POS-BUS
t o m un carcter CAR en la POS-BUS del BUFFER
fin while
devuelve POS-BUS
fin FUNCION

FIGURA 4.11-Lgica del programa principalpara leereg,junto con las


huicionei toma-reg0 y toma-campo0.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

108

CONCEPTOSFUNDAMENTALESDEESTRUCTURASDE...

en lugar de pensar en trminos del "primer registro", o el "segundo


registro". (Puede recordar cul registro est primero?) Esta idea de
una llave basada en el contenido es otra herramienta conceptual
fundamental, por ello es necesario desarrollar una idea ms precisa de
lo que es una llave.
Cuando se busca un registro que contenga el apellido Ames, el
usuario quiere reconocerlo, aunque introduzca la llave en forma de
"AMES", "ames", o "Ames". Para ello, se debe definir una forma
estndar para llaves, paralelamente con las reglas y procedimientos
asociados para convertirlas a esta forma. Una forma estndar de este
tipo suele llamarse forma cannica de la llave. Un significado de la
palabra canon es regla; la palabra cannico significa "en conformidad
con la regla". Una forma cannica para una llave de bsqueda es la
representacin nica para esa llave que se ajusta a la regla.
A manera de ejemplo, se podra establecer que la forma cannica
para una llave requiere que la llave consista slo en letras maysculas
y no tenga espacios adicionales al final. De modo que si un usuario
introduce "Ames", la llave se convertira a la forma cannicaUAMES"
antes de buscarla.
Una llave no tiene que corresponder a u n solo campo en un registro;
es posible constmir llaves que combinen informacin de ms de un
campo del archivo, por ejemplo, cuando se quiere usar el nombre y el
apellido de una persona para buscar un registro. Para ello es necesario
desarrollar una regla que combinelos campos del apellido y del nombre
en una llave en forma cannica. Una regla muy sencilla puede ser:
qjustar cada campo, concatenar un espacio al final delcampo
del apellido, despus concatenar el campo del nombre.
Convertir la cadena completa a maysculas.
Esta regla convierte el nombre John Ames en la forma cannicauAMES
JOHN". Si se compara esta llave con la del apellido solo, resulta mucho
ms adecuada para identificar un registro unfumamente.
Amenudo senecesitatenerllavesdistintas o llaves queidentifiquen
unvocamente un solo registro. Si no hay una relacin de uno a uno
entre la llave y un registro, entonces el programa tendra que proporcionar mecanismos adicionales que permitan al usuario resolver la
confusin que puede haber cuando existanmsregistrosqueconcuerden
con una llave en particular. Por ejemplo, suponga que se busca la
direccin de John Ames. Si hay varios registros en el archivo para
varias personas llamadas John Ames, cmo debera responder el
programa? Ciertamente, no debera proporcionar slo la direccin del
primer Jobn Ames que encuentre. Proporcionara todaslasdirecciones

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

EVALUACION DEL DESEMPERO DE LA BUSQUEDA

...

109

inmediatamente? Proporcionara una forma de moverse a travs de los


registros?
La solucin ms sencilla esprevenir tal confusin. La prevencin se
lleva a cabo conforme se agregan nuevos registros al archivo. Cuando
el usuario introduce un registro nuevo, se forma una llave cannica
para ese registro y despus se la busca en el archivo. Si ya existe, se
indica al usuario que modifique de alguna forma los campos de la llave,
de manera que sea nica.
Este requisito de unicidad se aplica slo alasllauesprimarias. Una
llave primaria es, por definicin, la llave que se usa para identificar
unvocamente un registro. Tambin es posible, como se ver posteriormente,buscar con llauessecundarias. Un ejemplo de llave secundaria
puede ser el campo de ciudad en el archivo de nombres y direcciones. Si
se pretende encontrar en el archivo todos los registros de las personas
que viven en ciudades llamadas Stillwater, se usara alguna forma
cannica de "Stillwater" como llave secundaria. Por lo regular, las
llaves secundarias no identifican un nico registro.

4.9

UNA BUSQUEDA SECUENCIAL


Ahora que se tiene acceso al concepto de llave cannica, estamos
preparados para escribir un programa llamado encuentra, que lea el
archivo, registro porregistro, buscando unocon unallave en particular.
Dicha bsqueda secuencial es slo una simple ampliacin del programa
leereg, con una operacin adicional de comparacin en el ciclo principal
para ver si la llave del registro corresponde con la llave que se busca.
La lgica de la parte principal de encuentra se ilustra en pseudocdigo
en la figura 4.12. Las funciones toma-regO y tomacampd) son las
mismas que se usaron en leereg. Los detalles de realizacin se proporcionan en las versiones del programa encuentra, escritas en C y en
Pascal, al final del capitulo.

4.10
EVALUACION DEL DESEMPERO
DE LA BUSQUEDA SECUENCIAL
En los captulos que siguen se encuentran formas de bsqueda de
registros ms rpidas que el mecanismo de bsqueda secuencial. Se
puede usar la bsqueda secuencial como una especie de punto de

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

110

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS D E . .

PRCGWLMA: e n c u e n t r a

abre e l a r c h i v o de e n t r a d a cono ARCH-ENT


lee APELLIDO y NOMBRE que se b u s c a r a
c o n s t r u y e l a f o m c a n n i c a LLAVE_BUS a partir de APELLIDO y NOMBRE
a s i g n a FALSO a ENCONTRO
LONG-REGISTRO := t o m a - r e g (ARCH-ENT, BUFFER)
m i e n t r a s ( n o ENCONTRO y LONG-REGISTRO > 0)
i n i c i a POS-BUS c o n O
PO-US
:= toma-campo (APELLIDO, BUFFER, PO-US,
LONG-REGISTRO)
POS-BUS : toma-campo (NOMBE, BUFFER, POS-BUS, LONG-EGISTRO)
f o m l a LLAVE-REGISTRO c a n n i c a a p a r t i r de APELLIDO y NOMBRE

s i (LLAVE-REGISTRO

== LLAVE-BUS)
a s i g n a VERDADERO a ENCONTRO

otro
LONG-REGISTRO
f i n mientras

s i (ENCONTRO)
l l a m a a toma_campa

:= to-reg

(ARCH-ENT,

BUFFER)

0 para leer y desplegar l o s c a m p o s d e l registro

FIGURA 4.12- Lgica del ciclo principal para encuentra.


comparacin para medir las mejoras que se hagan. Por lo tanto, es
importante encontrar alguna forma de expresar el tiempo y el trabajo
invertidos en una bsqueda secuencial.
Para desarrollar una medida de desempeo se requiere elegir una
unidad de trabajo que represente de manera til las restricciones del
desempeo del proceso total. Cuando se describe la eficiencia de las
bsquedas que se efectan en memoriaRAM electrnica, donde las operaciones de comparacin son ms costosas que las operaciones de extraccin de datos de la memoria, por lo regular se emplea el nmero de
comparaciones requeridas para la bsqueda como medida del trabajo.
Sin embargo, dado que el costo de una comparacin en FL4M es muy
pequeo en relacin con el costo de un acceso a disco, las comparaciones
no representan claramente las restricciones del desempeo de una
bsqueda en un archivo en almacenamiento secundario. En lugar de
esto, se cuentan las llamadas a la funcin READO de bajo nivel. Se supone que cada llamada a READO requiere un desplazamiento del brazo
del disco, y que todas las llamadas a READO tiene el mismo costo. Gracias al anlisis de temas como el manejo de buffers del sistema, en el captulo 3, se sabe que esas suposiciones no son precisas; sin embargo, en
un ambiente multiusuario, donde muchos procesos requieren el disco
a un mismo tiempo, resultan ser casi correctas y, por tanto, de utilidad.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

MEJORA DEL DESEMPEO DE LA BUSQUEDA..

111

Supongamos que en un archivo con 1000 registros se pretende usar


una bsqueda secuencial para encontrar el registro de Al Smith.
Cuntas llamadas a READO se requieren? Si el registro de Al Smith
es el primero del archivo, el programa tiene que leer slo un registro;
pero si es el ltimo, el programahace 1000 llamadas a READO antes de
concluir la bsqueda. Para realizar una bsqueda se necesitan, en
promedio, 500 llamadas.
Si se duplica el nmero de registros del archivo, tambibn se duplican el nmero promedio y el nmero mximo de llamadas a READO
requeridas. Usar una bsqueda secuencial para encontrar el registro
de Al Smith en un archivo de ,2000 registrosrequiere, en promedio, 1000
llamadas. En otras palabras, la cantidad de trabajo requerido por una
bsqueda secuencial es directamente proporcional alnmero de registros
del archivo.
En general, el trabajo requerido para buscar en forma secuencial
un registro en un archivo con n registros es proporcional a n; implica,
a lo sumo, n comparaciones y, en promedio, alrededor de n / 2 comparaciones. Se dice que una bsqueda secuencial es de orden O(n) porque
el tiempo que tarda es proporcional a n. +
Gran parte del resto de este libro est dedicado a identificar
mejores caminos para tener acceso a los registros individuales; la
bsqueda secuencial es demasiado costosa para la mayora de las
situaciones de extraccin de informacin. Hay, sin embargo, algunas
aplicaciones en las que la bsqueda secuencial puede ser razonable, tal
como en la bsqueda en archivos con muy pocos registros (p. ej., 10
registros), la bsqueda en archivos en los que casi nunca se necesita
buscar (p. ej., los archivos en cintas que normalmente se usan para otra
clase de procesamiento) y la bsqueda en archivos de registros con
cierto valor de llave secundaria, donde se espera que haya un gran
nmero de correspondencias.

4.11

MEJORA DEL DESEMPENO DE LA BUSQUEDA


SECUENCIAL: MANEJO DE REGISTROS EN
BLOQUES
Es interesante y til aplicar la informacin que proporciona el captulo
3 sobre desempeo del disco cuando se aborda el problema de meiorar
la eficiencia de la bsqueda secuencial. En dicho captulo se vio que el
principal costo asociado con un acceso al disco es el tiempo requerido
tSi no estA familiarizada can esta notaci6n, el lectar debe informarse al resp&.Knuth
[1973ales una buena fuente.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

112

CONCEPTOS FUNDAMENTALES DE ESTRUCTLTRAS D E . .

para efectuar un desplazamiento al lugar adecuado del disco. Una vez


que comienza, la transferencia de los datos es bastante rpida, aunque
an mucho ms lenta que una transferencia de datos dentro de memoria RAM. Por tanto, el costo que implica el desplazamiento y la
lectura de un registro y despus el desplazamiento y lectura de otro
registro es mucho mayor que el costo de un solo desplazamiento y luego
la lectura de dos registros sucesivos. (De nuevo, se supone un ambiente
multiusuario donde se requiere un desplazamiento por cada llamada a
READO.) Se concluye que existe la posibilidad de mejorar la eficiencia
de la bsqueda secuencial leyendo un bloque de variosregistros a lavez
y despues procesar ese bloque de registros en memoria RAM.
Se inici este captulo con una secuencia de bytes. Despus se
agruparon los bytes en campos y, por ltimo, se agruparon los campos
en registros. Ahora se est considerando un nivel de organizacin
todava superior, el agrupamientode registros en bloques. Sin embargo,
este nuevo nivel de agrupamiento se diferencia de los otros. Mientras
que los campos y registros son formas de mantener la organizacin
lgica dentro del archivo, el manejo de bloques es nicamente una
medida para mejorar el desempeo. Como tal, el tamao del bloque
tiene ms relacin con las propiedades fsicas de la unidad de disco que
con el contenido de los datos. Por ejemplo, en discos orientados por
sectores, el tamao del bloque casi siempre es algn mltiplo del
tamao del sector.
Supongamos que se tiene un archivo con 1000 registros, y que la
longitud media de un registro es de 64 bytes. Una bsqueda secuencial
sin manejo de bloques requiere, en promedio, 500 llamadas a READO
antes de poder extraer un registro en particular. Si los registros se
manejan en bloques y cada bloque contiene grupos de 32, de modo que
cada llamada a READO proporcione 2 kilobytes de registros, el nmero
de READ requeridos para una bsqueda media decrece a 15. Cada
READO requiere un poco ms de tiempo, ya que se transfieren ms
datos desde el disco, pero por lo regular es un gasto que vale la pena
hacer a cambio de la drstica reduccin en el nmero de lecturas.
Ntese que, aunque el manejo de registros en bloques puede brindar mejoras importantes en el desempeo, no cambia el orden de la
operacin de bsqueda secuencial. El costo de la bsqueda an es de
O(n), y se incrementa en proporcin directa al incremento del tamao
del archivo. Obsrvese tambin que estanueva herramienta refleja con
claridad las diferencias entre la velocidad de acceso a memoria RAM y
el costo del acceso al almacenamiento secundario. El manejo de registros en bloques no cambia el nmero de comparaciones que deben hacerse en memoria RAM, y es muy probable que incremente la cantidad
de datos transferidos entre el disco y la memoria RAM. (Siempre se lee
un bloque completo, aun cuando el registro que se busca sea el primero

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

113

ACCESO DIRECTO

del bloque.) El manejo de bloques ahorra tiempo, ya que disminuye el


nmero de desplazamientos del brazo del disco. Se encuentra, de nuevo,
que esta diferencia entre el costo del desplazamiento y el costo de otras
operaciones, como las transferencias o el acceso a memoria RAM, es la
fuerza que impulsa el diseo de estructuras de archivos.

4.12
ACCESO DIRECTO
La alternativa ms radical para la bsqueda secuencia1 de un registro
en un archivo es un mecanismo de extraccin de informacin conocido
como acceso directo. Se tiene acceso directo a un registro cuando es
posible colocarse directamenteen eliniciodel registro y leerlo. Mientras
que la bsqueda secuencia1 es una operacin O(n), el acceso directo es
O(1);noimporta cungrande seael archivo, conun solo desplazamiento
es posible extraer el registro que se quiera.
El acceso directo implica saber dnde est el comienzo del registro
requerido. Algunas veces esta informacin acerca de la posicin del
registro se guarda en un archivo separado de ndices. Sin embargo, por
el momento se supone que no existe un ndice, y que, en lugar de esto,
se sabe el nmero relativo de registro (NRR) del que se desea. La idea
de un NRR es un concepto importante que surge de la nocin de un
archivo como un conjunto de registros, y no como un conjunto de bytes.
Si un archivo es una secuencia de registros, entonces el NRR de un
registro proporciona su posicin relativa con respecto al principio del
archivo. El primer registro de un archivo tiene un NRR O, el siguiente
tiene un NRR 1, y as sucesivamente.
En el archivo de nombres y direcciones es posible unir un registro
a su NRRasignndole nmeros de membresarelacionados con el orden
en que se introducen los registros al archivo. La persona con el primer
registro puede tener el nmero de membresa 1001,la segunda, el
nmero 1002,y as sucesivamente. Dado un nmero de membresa,
puede restarse 1001 para tener el NRR del registro.
&u6se puede hacer con este NRR?Nomucho,ya que las estmcturas
de archivos que se han usado hasta ahora consisten en registros de
longitudvariable. El NRRindica la posicin relativa del registro que se
quiereen lasemenciaderegistros, peroan se debeleer secuencialmente
a lo largo del archivo, contando los registros que se llevan, para tener

'

t Respetando las mnvenciones de C y Turbo Paseal, se supone que el NRR es un contw


con base cero. En algunos sistemas de archivos, el conteo empieza en 1, en lugar de O.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

114

CONCEPTOS FUNDAMENTALESDE ESTRUCTURAS D E . .

el registro que se quiere. El ejercicio 20, al final de este captulo, explora


un metodo de movimiento a10largo de un archivo llamado procesamiento
secuencia1con saltos, que puede mejorar un poco el desempeo, pero la
bsqueda de un NRR en particular an es un proceso O(n).
Para que sea posible el acceso directo por NRR se necesita trabajar
con registros de longitud fija y conocida. Si todos los registros son de la
misma longitud, entonces se puede usar el NRR de un registro para
calcular la distancia en bytes del inicio del registro en relaci6n con el
inicio del archivo. Por ejemplo, si se est interesado en el registro con
NRR 546 y el archivo tiene registros de longitud fija de 128 bytes, se
puede calcular la distancia en bytes de la siguiente forma:
Distancia en bytes = 546 x 128 = 69 888.
En general, dado un archivo de registros de longitud fija de tamao r,
la distancia en bytes de un registro con un NRR de n es
Distancia en bytes = n x r
Los lenguajes de programacin y los sistemas operativos difieren
con respecto a dnde se hace este clculo de la distancia en bytes, e
incluso con respecto al uso de las distancias en bytes para hacer
referencia a direcciones dentro de los archivos. En C (y los sistemas
operativos UNIX y MS-DOS), donde un archivo se considera como una
mera secuencia de bytes, el programa de aplicacinhace el clculo y usa
la orden ZseekO para saltar al byte que inicia el registro. Todos los
movimientos dentro de un archivo estn en terminos de bytes. ste es
un punto de vista desde un nivel muy bajo; la responsabilidad de la
traduccin de un NRR a una distancia en bytes pertenece por completo
al programa de aplicacin.
El lenguaje PLli y los ambientes operativos en los que se usa con
frecuencia (OS/MVS,VMS) son ejemplos de un punto de vista diferente
y de nivel superior sobre los archivos. Laidea de una secuencia de bytes
sencillamente no existe cuando se trabaja con archivos orientados a
registros en este ambiente. Los archivos se conciben, en cambio, como
un conjunto de registros a los cuales se tiene acceso mediante llaves. El
sistema operativo se hace cargo de la traduccin entre una llave y la
posicin de un registro. En el caso ms sencillo,lallavees, de hecho, slo
el NRR del registro, pero la determinacin de la posicin real dentro del
archivo no es asunto del programador.
Si uno se restringe a usar Pascal estndar, la cuesti6n de la localizacin por bytes o l a localizacin por registros no es ningn problema:
no hay localizacin alguna en Pascal estndar. Pero, como se mencion6
anteriormente, muchas realizaciones de Pascal amplan la definici6n

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

ELECCION DE UNA ESTRUCTUR~

..

115

estndar del lenguaje para permitir el acceso directo a diferentes


localidades de un archivo. La naturaleza de esas ampliaciones vara
segn las diferencias de los sistemas operativos alrededor de los cuales
se desarrollan. Por ello, una caracterstica persistente en las diferentes
realizacionesesque un archivoen Pascal siempre comprendeelementos
de un solo tipo. Un archivo es una secuencia de enteros, o caracteres, o
arreglos, o registros, y as sucesivamente. La referencia a direcciones
siempre est en terminos del tamao del elemento fundamental. Por
ejemplo, se puede tener un archivo de regdato, donde regdato se define
como:
TYPE regdato = packed array [0..641 of char;

La localizacin dentro de este archivo est en terminos de mltiplos de


la unidad elemental regdato, esto es, en tdrminos de rnltiplos de una
entidad de 65 bytes. Si se pide saltar al regdato nmero 3 (conteo con
base cero), esto implica saltar 195 bytes (3 x 65 = 195) dentro del
archivo.

4.13

ELECCION DE UNA ESTRUCTURA Y UNA


LONGITUD DE REGISTRO
Una vez que se decide tijar la longitud de los registros para poder usar
el NRR y tener acceso directo a un registro, se debe determinar su
longitud. EstA claro que esta decisin est relacionada con el tamao
de los campos que se desea guardar en el registro. Algunas veces la
decisin es sencilla. Supongamos que se est constmyendo un archivo
de operaciones de venta que contiene la siguiente informacin acerca de
cada operacin:
O
O
O
D
D

Un nmero de cuenta de 6 dgitos para el comprador;


Seis dgitos para el campo de fecha;
Un nmero de inventario de 5 caracterespara el artculo comprado;
Un campo de 3 dgitos para la cantidad, y
Un campo de 10 posiciones para el costo total.

Todos esos campos tienen una1ongitudfija;la sumade sus longitudes


es de 30 bytes. Si se intenta almacenar los registros en un disco normal
dividido en sectores(v6ase el cap. 3) de 512 bytes de tamao, o de alguna
otra potenciade 2, puede convenir redondear el registro a 32 bytes para
poder colocar un nmero entero de registros en un sector.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

116

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS D E . . .

La eleccin de la longitud de registro es ms complicada cuando la


longitud de los campos puede variar, como en el archivo de nombres y
direcciones. Si se elige una longitud de registro equivalente a la suma
de los valores que, segn las estimaciones, sea lo m4s grande posible
paratodosloscampos, es seguro que habr suficienteespacioparatodo,
pero tambin bastante espacio desperdiciado. Por otra parte, si se es
moderado en el uso de espacio y se fijan las longitudes de los campos
conforme a los valoresms pequeos, tal vezhabra que dejar informacin
fuera de un campo. Por fortuna, se puede evitar hasta cierto grado este
problema con un diseo apropiado de la estructura de camposdentro de
un registro.
En el anlisis de las estructuras de la seccin 4.4 se presentan dos
enfoques generales que se pueden considerar aqu, referidos a la organizacin de campos dentro de un registro de longitud fija. El primero,
ilustrado en la figura 4.13(a),emplea camposde longitudfija dentro del
registro de longitud fija. Esteenfoque se tom en cuenta parael archivo
de operacionesdeventasdescritocon anterioridad. El seyndoenfoque,
ilustrado en la figura 4.13(b), usa el registro de longitud fija como una
especie de recipiente de tamafio estndar, para guardar algo que se
parece a un registro de longitud variable. El primer enfoque tiene la
virtud de la sencillez: es muy fcil "separar" los campos de longitud fija
dentro de un registro de longitud fija. El segundo enfoque permite
aprovechar un efecto normalizador que suele ocurrir: lo ms probable
es que los nombres ms largos no aparezcan en el mismo registro que

Ames

John

123 Maple

Stillwater

0K74075

Mason

Alan

90 E a s t g a t e

A&

OK74820

A m e s ~ J o h n ~ l 2M
3 a p l e i S t i l l w a t e r i O K ~ 7 5 1 t Espacio sin u s r
MasoniAlani90 Eastgate:A&~OKi74820:

t Espaciosin usar d

FIGURA 4.13-Dos enfoques fundamentales para la estructura de


campos dentro de un registro de longitud fija. (a) Registros de
longitud fiia con campos de longitud fiia. (b) Registros de longitud
Tia con campos de longitud variable.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

ELECCION DE UNA ESTRUCTURk

..

117

el campo de direccin ms largo. Al permitir que los lmites de los


campos varen se puede hacer un uso ms eficiente de la cantidad fija
de espacio. Tambin obsrvese que los dos enfoques no son excluyentes
entre si. Si tenemos un registro que contenga un nmero de campos de
longitud fija verdaderajunto con algunos campos que tengan informacin
de longitud variable, es posible disear una estructura de registro que
combine estos dos enfoques.
Los programas actua1iza.c y actualiza.pas, que se incluyen en el
conjunto de programas que aparecen al final del capitulo, emplean
el acceso directo para permitir al usuario extraer iin registro, cambiarlo,
y despus escribirlo de nuevo; dichos programas crean una estructura
de archivo que usa campos de longitud variable dentro de registros de
longitud fija. sta es una eleccin apropiada, considerando la variabilidadde longitudde loscamposen el archivodenombresy direcciones.
Una de las cuestiones ms interesantes que debe resolver el diseo
de esta clase de estructuras es distinguir la porcin de datos reales del
registro de la porcin de espacio no usado. La gama de soluciones
posibles es paralela a l a de las soluciones para el reconocimiento de
registros de longitud variable en cualquier otro contexto: se puede
colocar un contador de longitud del registro al inicio, se puede usar un
delimitador especial al final del registro, se puede contar los campos, y
as sucesivamnte. Como ambas, actua1iza.c y actualiza.pas, usan un
buffer de cadenas de caracteres para recolectar los campos, y como el
manejo de cadenas es diferente en C y en Pascal (en C las cadenas
terminan con un carcter nulo; en Pascal se mantiene el nmero de
bytes de la longitud de la cadena al inicio de stas), es conveniente usar
una estructura de archivo ligeramente diferente para las dos realizaciones. En la versin en C se ocupa la porcin no usada del registro
con caracteres nulos; en la versin en Pascal se coloca un campo de
longitud fija (un entero) al inicio del registro, para indicar cuntos bytes
del registro son vlidos. Como eshabitual, no existe una formacorrecta
nica de realizar esta estructura de archivo; en todos los casos, se debe
buscar la solucin ms apropiada, segn las nec<!sidadesy l a situacin
particulares.
La figura 4.14 muestra el vaciado hexadecimal de cadauno de estos
programas, en donde se introducen varias ideas ms, tales como el uso
de registros de encabezado, que se analizan en la siguiente seccin. Sin
embargo, por ahora slo se examina la estructura de los registros de
datos. En la salida del programa en Pascal, los campos de longitud al
inicio de los registros aparecen en cursivas. Aunque se llenaron los
registros creados por el programa en Pascal con espacios, para hacer l a
salidams legible, esto es innecesario. El campo delongitud al principio
del registrogarantiza que no se leer ms all del final de los datos que
contiene.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

118

O
10

CONCEPTOS FUNDAMENTALES DE ESTRUCTURA^ DE..

- 1F

20
30
40
50

- 2F

60
70
80
90

- 61
- 7F

3F
4F
5F

j 8F
- 9F

02000000
00000000

00000000
00000000

00000000 00000000
00000000 00000000

41606573
706C657C
487C3134
00000000

lC4A6F68
5374696C
3037351C
00000000

637C3132
6C776174
O0000000
00000000

33204061
65727C4F
00000000
O0000000

4D61736F
73146161
3832307C
00000000

6ElC416C
74657C41
00000000
00000000

616ElC39
64617C4F
00000000
00000000

30204561
487C3134
00000000
O0000000

02000000
00000000
0000000~
00000000
0000

00000000
00000000
0000nooo
00000000

00000000 00000000
00000000 00000000

2800
33204061
65727C4F
20202020
20202020

41606573
706C65lC
4Blc3734
20202020

7C4A6F68
5314696C
3037357C
20202020

6E7C3132
6~776174
20202020
20202020

24004061
45617374
31343832
20202020
2020

736F6ElC
67617465
307C2020
20232020

4165616E
lC416461
20202020
20202020

7C393020
7C4F4BlC
20202020
20202020

oooooooo oooooooo
00000000 00000000

................
................

Registro de encabezado

Contador de regisvo en I<


primeros 2 byies

m e s ; ~ o h n1 123 : ~ a h h c r l c g i ~ I r 0
ple Stillwater I 0
K ; 75075 1 ........

................

1 90 Ea

stgate 1 Ada
820 1

: OK 1 74

Segundoregistro

............

................

................
................
................

................

Registro de encabezado

Contador de registro en los


primeros 2 bytes

..

{ . m e s ; ~ o h n1 12
3M
~ ; srillwar
~
I
~
erlo~ 74075 1

$.Masa"

Alan

: 90 Eastgate I Ads
; OK

Primer registra
El entero en los primeros
dos bytes contiene el
nmero de bytes de datos
de registro
Segundo registro

174820:

FIGURA 4.14. Dos estructuras de registro distintas que llevan


campos de longitud variable en un registro de longitud fija. (a)
Estructura de registro creada por actualiza.^: registros de longitud
fiia que contienen campos de longitud variable terminados con un
carcter nulo. (b) Estructura de registro creada por actualiza.pas:
los registros de longitud fija comienzan con un campo (entero) de
longitud fija que indica el nmero de bytes utilizables en los
campos de longitud variable del registro.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

ACCESO Y ORGANIZACION DE ARCHIVOS

4.14
REGISTROS DE ENCABEZADO
A menudo es necesario, o til, mantener informacin general sobre un
archivo que se usar en el futuro. Por ejemplo, en algunas versiones de
Pascal no esfcil saltarhasta el final del archivo, aunquela realizacin
permita el acceso directo. Una solucin simple a este problema es
mantener el contador del nmero de registros del archivoy almacenarlo
en alguna parte. Muchas veces se coloca un registro de encabezado al
principio del archivo para guardar esta clase de informacin.
El registro de encabezado tiene una estructura diferente de la que
tienen los registros de datos del archivo. Por ejemplo, la salida de
actua1iza.c usa un registro de encabezado de 32 bytes, mientras que
cada uno de los registros de datos contiene 64 bytes. Asimismo, los
registros de datos creados por actua1iza.c contienen slo caracteres
como datos, mientras que el registro de encabezado contiene un entero
que indica cuntos registros de datos hay en el archivo. La diferencia
entre los registros de encabezado y los de datos se acenta al incluir
informacin como la longitud de registro de los registros de datos, la
fecha y la hora de la actualizacin mas reciente del archivo, etctera.
Al realizar los registros de encabezado en Pascal, el programador
suele adecuar las diferencias entre los registros de datos y los de
encabezado mediante el uso de un registro variante. En actualiza.pas
se muestraunasolucin ms sencilla an: seusael campo entero inicial
del registro para un propsito diferente en el registro de encabezado. En
los registros de datos este campo guarda el nmero de bytes de datos
vlidos dentro del registro; en el registro de encabezado y a r d a el
nmero de los registros de datos del archivo.
Los registros de encabezado son una herramienta de diseo de
archivos muy difundida e importante. Por ejemplo, cuando se llegue al
punto en donde se hace el anlisis de la construccin de ndices para
archivos, se observar que los registros de encabezado con frecuencia
se colocan al principio del ndice para mantener informacin sobre
datos tales como el NRR del registro que es la base del ndice.

4.15

ACCESO Y ORGANIZACION DE ARCHIVOS


Durante el curso de este captulo se examinaron:
O
O

Los registros de longitud variable;


Los registros de longitud fija;

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

120

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

O
O

El acceso secuencial, y
El acceso directo.

Los primeros dos trminos se relacionan con aspectos de organizacin


de archivos. El segundo par de trminos se refiere al acceso a l archiva.
La distincin entre la organizacin y el acceso a los archivos es de
utilidad, por lo que resulta necesario examinarla con ms detalle antes
de concluir el captulo.
La mayor parte de lo considerado hasta aqu entra en la categora
de organizacin de archivos. Puede un archivo estar dividido en
campos? Hay un nivel ms alto de organizacin para el archivo, que
combine los campos en registros? Tienen todos los registros el mismo
nmero de bytes o de campos? Cmo se distingue un registro de otro?
Cmo se organiza la estructura interna de un registro de longitud fija,
de tal forma que se pueda distinguir entre los datos y el espacio
adicional? Se h a visto que hay muchas respuestas posibles a esas
preguntas y que la eleccin de unaorganizacin de archivosen particular
depende de muchos factores; entre ellos, las facilidades que brinde el
lenguaje que se utilice y el uso que se quiera d a r a l archivo.
Usar un archivo implica tener acceso a l. Se examin primero el
acceso secuencial, parallegar a desarrollar una bsqueda secuencial en
los programasencuentra.cy encuentra.pas. Mientrasno se sabia dnde
empezaban los registros individuales, el acceso secuencial era l a nica
opcin abierta. Cuando se escribi el programaactualiza, se pretendi
elaccesodirecto, de tal forma que se fij lalongitud de los registros para
calcular con precisin dnde principiaba cada registro y poder hacer la
localizacin directamente all.
En otras palabras, la necesidad del acceso directo motiv la eleccin
de la organizacin del archivo en registros de longitud fija. Significa
esto que se pueden equiparar los registros de longitud fija con el acceso
directo? Definitivamente no. No hay nada, al fijar la longitud de los
registros de un archivo, que excluya el acceso secuencial; sin duda se
podra escribir un programa que lea secuencialmente un archivo con
registros de longitud fija.
No slo se puede leer alolargo de registros delongitud fijaen forma
secuencial, sino que tambin se puede proporcionar el acceso directo a
registros de longitud variable con slo mantener una lista de las
distancias en bytes desde el inicio del archivo hasta lalocalidad de cada
registro. Se eligi la estructura de registro que se usa en actua1iza.c y
actualiza.pas porque es sencilla y adecuada para los datos que se
quieren almacenar. Aunque varan las longitudes de los nombres y
direcciones, la variacin no es tan grande como para que no se pueda
acomodar en un registro de longitud fija. Sin embargo, considrense los
efectos del uso de una organizacin de registros de longitud fija para

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

RESUMEN

121

proporcionar acceso directo a registros que sean documentos con un


margen de longitud que vaya desde unas pocas centenas de bytes hasta
ms de cien kilobytes. Los registros de longitud fija representaran un
desperdicio de espacio escandaloso, de modo que habra que encontrar
alguna forma de estructurar registros de longitud variable. A fin de
desarrollar estructuras de archivos adecuadas para tales situaciones se
necesita distinguir con claridad entre el acceso y las opciones de organizacin.
Las restricciones impuestas por el lenguaje y el sistema de archivos
empleados para desarrollaraplicacionesestablecen, ciertamente,lmites
a la capacidad del diseador para aprovechar esta distincin entre el
mtodo deacceso y la organizacin. Por ejemplo, ellen guaje C proporciona
al programador ;a posibilidad de realizar el acceso directo aregistros de
longitud variable, puesto que permite el acceso a cualquier byte del
archivo. Por otro lado, Pascal, aun cuando disponga de localizacin,
impone limitaciones relacionadas con la definicin que tiene de un archivocomoun conjuntode elementosdelmismo tipoy,porconsiguiente,
del mismo tamafio. La localizacin se efecta, por lo regular, slo al
inicio de un elemento. Puesto que en Pascal todos los elementos deben
ser del mismo tamao, el acceso directo aregistros de longitudvariable
es, en el mejor de los casos, difcil.
Cada uno de los dos modos de acceso bsicos, secuencia1 y directo,
tiene usos importantes. Est claro que el acceso directo e s preferible
cuando slo se necesitan unos pocos registros especficos;pero el acceso
directo no siempre es el mtodo ms apropiado para la extraccin de
informacin. Por ejemplo, si se estn preparando cheques de pago
usando un archivo de registros de empleados, normalmente no ser
necesario para hacer el clculo de las posicionesde los registros. Puesto
que todos los registros del archivo deben procesarse, es ms rpido y
sencillo empezar por el principio y trabajar a lo largo del archivo,
registro por registro, hasta llegar al final.

RESUMEN
El nivel ms bajo de organizacin que por lo regular se impone a un
archivo es el de una secuencia de bytes. Por desgracia, al almacenar los
datos en un archivo slo como una secuenciade bytes, se pierde lacapacidad de distinguir entre las unidades fundamentales de informacin
de los datos. A estas piezas fundamentales de informacin se les llama
campos. Los campos se agrupan para formar registros. Para reconocer

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

122

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

los campos y los registros se debe imponer una estructura alos datos del
archivo.
Existen varias formas de separar un campo de otro y un registro de
otro:
1. Fijar la longitud de cada campo o registro.
2. Empezar cada campo o registro con el nmero de bytes que
contenga.
3. Usar delimitadorespara marcarlasdivisionesentre entidades.
Otra tcnica til, en el caso de los registros, es usar un s e y n d o archivo
de ndices que informe dnde empieza cada registro.
A menudo tambin se impone a los archivos una organizacin de
nivel superior, donde los registros se agrupan en bloques. Este nivel se
impone para mejorar la eficiencia de la EIS en lugar de slo mejorar el
punto de vista lgico del archivo.
E n este capitulo se usa l a estructura de registro que emplea un
indicadorde longitud al iniciode cadauno paradesarrollar los programas
que escriben y leen un archivo de registros de longitud variable con
nombres y direcciones de personas. Se usa el manejo de buffers para
acumular el dato en un registro individual antes de conocer sulongitud
para poderlo transcribir al archivo. Los buffers tambin son tiles para
realizar l a lectura de un registro completo a la vez. Se representa el
campo de longitud de cada registro como un nmero binario o como una
secuencia de digitos ASCII. En el primer caso es til usar un vaciado
hexadecimal para examinar el contenido del archivo.
Algunas veces se identifican los registros individuales por su nmero relativo de registro (NRR) en un archivo. Sin embargo, a menudo
se necesita tambin identificar un registro mediante una llave, cuyo
valor est basado en algo del contenido del registro. Los valores llave
deben presentarse en a l y n a forma cannica predeterminada, o convertirse en sta, para que los programas las reconozcan en forma
precisa y sin ambigedades. Si cada valor llave de registro es distinto
de los dems, la llave puede emplearse para identificar y ubicar un
registro nico en el archivo. A las llaves que se usan en esta forma se
les llama llaves primarias.
En este capitulo se examina un programa llamado encuentra, que
busca secuencialmente a lo largo deun archivo un registrocon unallave
en particular. La bsqueda secuencial puede tener un desempeo
deficiente en archivos grandes, pero hay ocasiones en que la bsqueda
secuencial es adecuada. El manejo de registros en bloques puede usarse
para mejorar considerablemente el tiempo de E/S en una bsqueda
secuencial.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

TERMINOS CLAVE

En el anlisis anterior sobre las formas de separar registros se vio


con claridad que algunos de los mtodos brindan un mecanismo para
averiguar o calcular la distancia en bytes desde el inicio de un registro.
Esto, a suvez, abrela posibilidad de acceder alosregistrosdirectamente,
por NRR, en lugar de hacerlo en forma secuencial.
El formatoms simple de registro que permite el acceso directo por
NRR implica el uso de registros de longitud fija. Cuando los datos
por s mismos tienen tamao fijo (p. ej., cdigos postales), los registros
de longitud fija pueden tener un buen desempeo y utilizar bien el
espacio. Sin embargo, cuando la cantidad y tamao de los datos en los
registros es muy variable, el uso de registros de longitud fija puede
ocasionar un costoso desperdicio de espacio. En tales casos, el diseador debe examinar con cuidado la posibilidad de usar registros de longitud variable.
Algunas veces es til mantener informacin general acerca de los
archivos, como el nmero de registros que contienen. Un registro de
encabezado, almacenado al inicio del archivo al que pertenece, es una
herramienta til para almacenar este tipo de informacin.
Es importante ser cuidadoso con las diferencias entre el acceso a l
archivo y la organizacin del archivo. Se intenta organizar los archivos
de manera que permitan los tipos de acceso necesarios para una
aplicacin en particular. Por ejemplo, una de las ventajas de la organizaci6n de registros de longitud fija es que permite tanto el acceso secuencial como el directo.

TERMINOS CLAVE
Acceso directo. Modo de acceder a un archivo que implica saltar al
lugar preciso de un registro. El acceso directo a un registro de
longitud fija por lo regular se lleva a cabo mediante su nmero
relativo de registro (NRR), despus calculando su distancia en
bytes y, por ltimo, colocndose en el primer byte del registro.
Acceso secuencial. El acceso secuencia1 a un archivo significa leer
el archivo desde el principio y continuar hasta que se haya ledo
todo lo que se necesita. La alternativa es el acceso directo.
Bloque. Conjunto de registros almacenados como una unidad
fsicamente contigua en el almacenamiento secundario. En este
capitulo se manejaron los registros por bloques para mejorar la
eficiencia de la EIS durante la bsqueda secuencial.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

124

CONCEPTOS FUNDAMENTALES DE E S T R U C T W D E . .

B s q u e d a secuencial. Mtodo de bsqueda en un archivo, que


implica leer el archivo desde el principio y continuar haciendolo
hasta que se haya encontrado el registro deseado.
Campo. La ms pequea unidad lgicamente significativa de un
archivo. Un registro de un archivo por lo regular est compuesto
de vanos campos
C a m p o d e c o n t e o d e bytes. Campo al inicio de un registro de longitud variable que indica el nmero de bytes usados para almacenar el registro. El uso de un campo de conteo de bytes permite
al programa transmitir (o saltar) un registro de longitud
variable sin necesidad de alterar la estructura interna del
registro.
Delimitador. Uno o ms caracteres usados para separar campos y
registros en un archivo.
F o r m a cannica. Forma estndar para una llave que puede
derivarse, con la aplicacin de reglas bien definidas, a partir de
la forma no estndar particular de los datos encontrados en un
campo de llave del registro, o que puede ser proporcionada en
una solicitud de bsqueda por parte del usuario.
Llave. Expresin derivada de uno o ms campos dentro de un
registro, que puede usarse para ubicar ese registro. A los campos
usados para construir una llave se les denomina campos de
llave. El acceso por llave proporciona una forma de recuperar
informacin que se basa en el contenido de los registros, y no en
s u posicin.
Llave primaria. Llave que identifica unvocamente cada registro y
que se usa como el mtodo primario de acceso a los registros.
Mtodo de acceso a u n archivo. El enfoque proporcionado para
localizar informacin en un archivo. En general, las dos
alternativas que hay son acceso secuencia1 y acceso directo.
Mtodos d e o r g a n i z a c i n d e archivos. La combinacin de
estructuras conceptuales y fsicas empleadas para distin y i r un
registro de otro y un campo de otro. Ejemplos de un tipo de
organizacin de archivos son los registros de longitud fija,
que contienen varios campos delimitados de longitud
variable.
N m e r o r e l a t i v o d e r e g i s t r o (NRR). Indice que da la posicin de
un registro en relacin con el inicio de su archivo. Si un archivo
tiene registros de longitud fija, el NRR puede usarse para
calcular l a distancia en bytes a un registro de tal forma que se
pueda acceder directamente a l.
Registro. Conjunto de campos relacionados. Por ejemplo, el nombre,
la direccin, y dems datos de una persona en un archivo de lista
de correos, con probabilidad conformara un registro.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

EJERCICIOS

Registrode encabezado. Registro colocadoal iniciode un archivo,


que se usa para guardar informacin acerca de s u contenido y
organizacin.
Registros de longitud fija. Organizacin de archivos en la que
todos los registros tienen la misma longitud. Los registros se
completan con espacios, nulos, u otros caracteres, de tal forma
que se extiendan a la longitud fijada. Puesto que todos los
registros tienen la misma longitud, es posible calcular la
posicin de inicio de cada registro, haciendo posible el acceso

directo.
Registros de longitud variable. Organizacin de archivos en
donde los registros no tienen una longitud predeterminada; son
tan largos como sea necesario y, por tanto, permiten un mejor
uso del espacio que los registros de longitud fija.
Desafortunadamente, no es posible calcular l a distancia en
bytes a un registro de longitud variable nicamente con su
nmero relativo de registro.
Secuencia de bytes. Trmino que describe el punto de vista de
ms bajo nivel de un archivo. Si se empieza con el punto de vista
bsico de un archivo, como secuencia de bytes, entonces se puede
imponer niveles superiores de orden en el archivo, como
estructuras de campos, registros y bloques.

EJERCICIOS
1.Encuentre situaciones donde sean apropiadas cada una de las tres
estructuras de campos descritas en el texto. Haga lo mismo para cada
una de las estructuras de registro descritas.

2. Analice cun apropiado es el uso de los siguientes caracteres para


delimitar campos en registros: retorno de carro, salto de lnea, espacio,
coma, punto, dos puntos y escape. Puede imaginar situaciones en las
que se plantee usar delimitadores diferentes para campos diferentes?
3. Suponga que se quiere cambiar los programas para incluir un campo
de nmero telefnico en cada registro. Qu cambios necesitan hacerse?
4. Suponga que se necesita guardar un archivo en el cual cada registro
tiene campos de longitudfijay camposde logitud variable. Por ejemplo,
se quiere crear un archivo de registros de empleados, usando campos de
longitudfijaparacadaidentificadorde empleado (llave primaria), sexo,

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

126

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

fecha de nacimiento y departamento, y campos de longitud variable


para cada nombre y direccin. Quventajas pueden justificar el uso de
dicha estructura? Pondra la parte de longitud variable al principio o
al final? Cualquiera de los dos enfoques es posible; cmo puede
realizarse cada uno?

5. Una estructura de registro no descrita en este captulo se llama


rotulada. En una estmctura de registros rotulados, cada campo que se
representa e s precedido por un rtulo que describe su contenido. Por
ejemplo, si se usan los rtulos AP, NO, DI, CD, ED y C P para describir
los seis campos de longitud fija para un registro de nombre y direccin,
Bste podra aparecer asi:

En qu condiciones puede ser razonable, e incluso deseable, esta


estructura de registro?

6. Proporcione los significados de los trminos secuencia de bytes,


secuencia de campos y secuencia de registros.

7. Encuentre las estructuras de archivos bsicas disponibles en el lenguaje de programacin que actualmente usa. Porejemplo, reconoce su
lenguaje un tipo de estmctura de secuencia de bytes? Reconoce lneas
de texto?Maneja bloques de registros? Explique cmo puede desarrollar
los tipos de estructuras que sulenguajeno reconoce, usando estructuras
que s reconozca.
8. Indique cules son las estructuras de campos y registros bsicas
disponibles en PL'I o en COBOL.

9. Compare el uso de caracteres ASCII para representar todo en un


archivo contra el uso de datos binarios y ASCII mezclados.
10. Si se lista el contenido de un archivo con caracteres tanto ASCII
como binarios en la pantalla de la terminal, qu resultados se esperaran? Qu sucede cuando se lista un archivo completamente binario en
l a pantalla? (Cuidado. Si realmente intenta esto, hgalo con un archivo
muy pequeo; podra bloquear o reconfigurar la terminal, o incluso
salirse del sistema).
11.Si una llave en un registro est ya en forma cannica y e s s u primer
campo, es posible buscar un registro por llave sin separar el campo llave
del resto de los campos. Explique.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

EJERCICIOS

12.Se ha planteado (Sweet, 1985) que las llaves primarias deben ser
"sin datos, invariables, precisas y nicas." Analice l a importancia de
cada criterio y muestre, por ejemplo, cmo es que su ausencia podra
provocar problemas. La llave primaria usada en el archivo del ejemplo
viola alguno de los criterios?
13.iCuntas comparaciones se requeriran en promedio para encontrar
un registro en un archivo con 10 000 almacenado en disco, usando la
bsqueda secuencia]? Si el registro no est en el archivo, cuntas
comparaciones se requieren? Si el archivo se maneja por bloques, de tal
forma que se guardan 20 registros por bloque, cuntos accesos se
requieren en promedio? Cuntos, si slo se guarda un registro por
bloque?
14. En la evaluacin del desempeo de la bsqueda secuencial, se supone que toda lectura implica un desplazamiento del brazo del disco.
Cmo cambian las suposiciones en una mquina con un solo usuario?Cmo afectan el anlisis de labsquedaestas nuevas suposiciones?
15. Proporcione una frmula para encontrar el desplazamiento en
bytes de un registro de longitud fija donde el NRR del primer registro
es 1 en lugar de O.
16. Por qu no funciona la estructura de registros de longitud variable
en el programa actualiza? Ayudara tener un ndice que apunte al
inicio de cada registro de longitud variable?

17. El programa actualiza permite al usuario modificar registros, pero


no eliminarlos. Cmo se deben modificar la estructura de archivo y los
procedimientos de acceso para que permitan la eliminacin, si no tiene
importancia la reutilizacin del espacio de los registros eliminados?
Cmo cambian las estructuras de archivos y los procedimientos si se
quiere reutilizar el espacio?

18. En el anlisis de los usos delos nmeros relativos de registro (NRR),


se dice que puede crearse un archivo en el que existaunacorrespondencia
directa entre una llave primaria, tal como un nmero de membresa, y
el NRR, de tal forma que pueda encontrarse el registro de una persona
conociendo slo el nombre o el nmero de membresa. &u6 clase de
problemas pueden encontrarse con esta correspondencia simpie entre
el nmero de membresia y el NRR? Qu sucede si se quiere eliminar
un nombre? Qu sucede si se cambia la informacin que hay en un
registro de un archivo con registros de longitud variable y l a nueva
longitud es mayor?

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

128

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS D E . .

19. El siguiente vaciado hexadecimal describe los primeros bytes de un


archivo del tipo producido por la versin C de escribereg, pero la
columna dela derecha estvaca. De qu tamao es el primer registro?
Cul es su contenido?

20. Suponga que se tiene un archivo de registros de longitud variable

con registros largos (de ms de 1000 bytes cada uno, en promedio).


Suponga que se est buscando un registro con un NRR en particular.
Describa los beneficios de usar el contenido de un campo de conteo de
bytes para saltar secuencialmente, de registro en registro, hasta
encontrar el que se desea. A esto se le llama procesamiento en saltos
secuenciales. Emplee los conocimientos adquiridos sobre manejo de
buffers del sistema para describir por qu esto slo es til para registros
largos. Si los registros se clasifican segn un orden por llave, y se
manejan por bloques, qu informacin se tiene que colocar al inicio de
cada bloque para lograr un procesamiento en saltos secuenciales an
ms rpido?
21. Suponga que se tiene un registro de longitud fija con campos de
longitud fija, y que la suma de las longitudes de los campos es de 30
bytes. Un registro conunalongitud de 30bytes podra guardarlos todos.
Si se intenta almacenar los registros en un disco manejado por sectores
de 512 bytes (vase Cap. 31, puede decidirse rellenar el registro a 32
bytes de tal forma que pueda colocarse un nmero entero de registros
en un sector. Por qu se querra hacer esto?
22. Por qu es importante distinguir entre el acceso a archivos y la

organizacin de archivos?

EJERCICIOS DE PROGRAMACION
23. Reescriba escribecad, de tal forma que use delimitadores como

separadores de campos. La salida de la nueva versin de escribecad


deber ser legible para 1eecad.c o para 1eecad.pas.
24. Desarrolle versiones de escribereg y leereg que usen las siguientes

longitudes fijas de campos en vez de delimitadores.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

EJERCICIOS

Apellido:
Nombre:
Direccin:
Ciudad:
Estado:
Cdigo postal:

15 caracteres
15 caracteres
30 caracteres
20 caracteres
2 caracteres
5 caracteres

25. Escriba el programa descrito en el problema anterior de tal forma


que use bloques. Almacene cinco registros por bloque.
26. Haga el programa encuentra
27. Reescriba el programa encuentra de modo que pueda encontrar un
registro por su posicin en el archivo. Por ejemplo, si se pide encontrar
el registro 547 de un archivo, leera los primeros 546 registros y despus imprimira el contenido del registro 547. Use bsqueda con saltos
secuenciales (vase el ejercicio 20) para evitar leer el contenido de los
registros que no se desean.
28. Escriba un programa parecido a encuentra, pero con las siguientes
diferencias: en lugar de recibir las llaves de los registros mediante el
teclado, las lee de un archivo de transacciones separado que contiene
slo las llaves de los registros por extraer. En vez de mostrar los registros en la pantalla, los escribe en un archivo de salida separado. Primero, suponga que los registros no estn en un orden en particular.
Despus, suponga que tanto el archivo principal como el de transacciones estn clasificados por llave. En el ltimo caso, cmo puede lograrse
que el programa sea ms eficiente que el programa encuentra?
29.Haga cualquieradelassiyientesmodificaciones,o todas, aactualira.pas o a actua1iza.c.
i
i
i

Permita que el usuario identifique por nombre el registro que


ser modificado, y no por NRR;
Permita al usuario modificar campos individuales sin tener que
cambiar un registro completo, y
Proporcione al usuario la opcin de revisar el archivo completo.

30. Modifique actua1ira.c y actualiza.pas para sealar al usuario cuando un registro excede su longitud fija. La modificacin permitir al
usuario reducir el registro a un tamao aceptable e introducirlo de
nuevo. Qu otras modificaciones haran ms slido el programa?

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

130

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

31.Cambieactualiza.c y actualza.pas a u n programa de procesamiento


por lotes que lea un archivo de transacciones, donde cada registro de
transaccin contenga el NRR de un registro por actualizar, seguido por
su nuevo contenido, y que despus haga los cambios en una ejecucin
por lotes. Aunque no es necesario, es deseable clasificar el archivo de
transacciones por NRR. Por qu?
32. Escriba un programa que lea un archivo y escriba su contenido en
forma de un vaciado hexadecimal. El vaciado hexadecimal debe tener
un formato parecido al que se us en los ejemplos de este capitulo. El
programa debe leer el nombre del archivo de entrada de la lnea de
rdenes. La salida debe presentarse en la salida estndar (la pantalla
de la terminal).

33. Desarrolle un conjunto de reglas para traducir las fechas: agosto 7,


1949;Ag. 7,1949; 8-7-49; 08-07-49;8/7/49, y otrasvariacionesparecidas,
a una forma cannica comn. Escriba una funcin que lea una cadena
que contenga una fecha en una de esas formas y devuelva la forma
cannica de acuerdo con sus propias reglas. Asegrese de documentar
las limitaciones de su funcin y de sus reglas.

LEC'IZTRAS ADICIONALES
Muchos libros de texto cubren el material bsico del diseo de estruc- turas de
campos y registros, pero slo unos pocos abordan lasconsideracionesy opciones
de diseo con mucho detalle. Dos posibles fuentes son Teorey y Fry I19821 y
Wiederhold[1983].El capitulo'%hoiceofFile Organization", de Hanson [19821,
es excelente, pero resulta ms provechoso despus de leer el material de los
ltimos captulos de este texto. Se puede aprender mucho sobre los tipos de
alternativas de organizacin y acceso a archivos estudiando las descripciones
delas opciones dis-poniblesen ciertos lenguajes y sistemas administradores de
archivos. PWI ofrece un conjunto de alternativas particularmente rico, y
Pollack y Sterling [19801 las describen bien y ampliamente.
Sweet [19851 es un artculo corto pero estimulante sobre el diseo de
campos de llave. Se describen varios algoritmos interesantes para mejorar la
eficiencia de las bsquedas secuenciales en Gonnet [19841 y, por supuesto, en
Knuth [1973bl.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN C: ARCHES.H

131

PROGRAMAS EN C

Los programasen C q u e selistan e n l a s siguientespginascorresponden


a los p- r o -g r a m a s analizados e n el texto. Los p- r o-g r a m a s e s t n contenidos
e n los siguientes archivos.
Escribe l a informacin de nombres y direcciones como
una secuencia de bytes consecutivos.
Lee un archivo de secuencia de bytes como entrada y lo
muestra en la pantalla.
Escribe un archivo de registros de longitud variable,
que usa un contador de bytes al inicio de cada registro
para proporcionar su longitud.
Lee un archivo, registro por registro, mostrando los
campos de cada registro en l a pantalla.
Contiene funciones de apoyo para la lectura de registros
o campos individuales. Estas funciones son necesarias
para los programas 1eereg.c y encuentra.c
Busca un registro con una llave en particular en forma
secuencial a lo largo de un archivo.
Combina el nombre y el apellido y los convierte en una
llave en forma cannica. Llama a cadblancl) y
maysculas0, que se encuentran en funscads.~.
Contiene dos funciones de apoyo para cadenas:
cadespacO elimina los espacios del final de las cadenas;
maysculas0 convierte los caracteres alfabticos en
maysculas.
Permite agregar registros nuevos a un archivo, o
modificar registros existentes.

Todos los programas incluyen un archivo d e encabezado llamado


arches.h, el cual contiene definiciones tiles, a l g u n a s d e ellas dependientes del sistema. S i los programas fueran ejecutados e n u n s i s t e m a
UNIX, arches.h podra s e r as?

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

132

CONCEPTOSFUNDAMENTALESDEESTRUCTURASDE...

/*
arche5.h--archivo&en&zadoquecaitienelas
definiciones de E/S para archivos

*/
#define
Xdefine
tdefine
tdefine
#define
#define

PMODE
SOiOLECT
SOLOESCRIT
LECPESCRIT
DELIM-CAD
DELIM-m

Xdefine TM-MAX-FSG

0755
O

1
2

1"
'1'

"

512

Crea el archivo de nombres y direcciones que es, en forma estricta,


una secuencia de bytes (sin delimitadores, contadores, u otra
infomci6n que ayude a distinguir campos y registros).
Una modificaci6n simple a la macro saca-cad:
#define

sacocad(fd, cad)

write( (fd), (cad), strlen (cad)) ; \


write((fd) , DELIM-CAD,1):

cambia el programa de tal 0-

que crea campos delimitados.

*/
#include "arches.hV
#define saca-cad (fd,cad)

char
char
char
int

write ( (fd), (cad),strlen (cad))

nombre[30], apellido[30], direcci6n[30], ciudad[20];


estado[l51, ~p[91;
nomarch[lSl ;
fd;

printf("Propcrcione el nombre del archivo que quiera crear:


gets (nomarch);
if

(fd = creat (nomarch,PMODE)) < O)

");

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN C: Ll3ESEt.C

printf("Error en la apertura del archivo


programa\nq')
; exit (1);

--- Fin de

1
printf("\n\nDigite un apellido, o <CR> para salir\n>>><');
gets (apellido):
while (strlen(apellido) > O)
(

printf ("\n Nombre:");


gets (nombre);
printf ( " Direccin:") ;
gets(direccion);
printf ( "
Ciudad:" ) ;
gets (ciudad);
printf ( "
Estado:" ) ;
gets (estado);
printf ("Cod. Post.:" ) ;
gets (cp):

/* Traslada las cadenas al buffer y despues al archivo */


saca-cad(fd,apellido);
saca-cad(fd,nombre) :
saca-cad (fd,direccin);
saca-cad (d.ciudad);
saca-cad(fd,estado);
saca-cad (fd,cp);

/ * se prepara para los siguientes datos * /


printf("\n\nDigite un apellido, o <CR> para salir\n>>>");
gets (apellido);
1

/* Cierra el archivo antes de terminar * /


close (fd);
1

lee una secuencia de campos delimitados

*/
tinclude "arches.h"

(continuacin)

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

134

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

int fd ,n;
char cad[30];
char nomrch[l5]:
int contcampos;
printf("Proporcione el nombre del archivo a leer: " ) ;
gets (nomarch);
if ( (fd = creat (nomrch,SOLOLECT)) < O) {
printf("Error en la apertura del archivo - fin de programa\nW);
exit (1);

/* Ciclo del programa principal

- llama a leecampo0 hasta que


*/
se leen todos los campos

cont-campos = 0;
while ( (n = leecampo (fd,cad)) > 0)
printf ("\tCampo # %3d: %s\n",++cont-campos,cad);
close (fd);

1
leecampo (fd,cad)
int fd;
char cad [ ] ;
(

int i;
char c;
i = 0.
while ( read(fd,hc,l) > O 6 8 c ! = DELIM-m)
cad[i++l = c:
cad[ll = '\O';

/ * Agrega un carcter nulo al final de la cadena

*/
return (i);

Crea el archivo de nombres y direcciones empleando un campo de


longitud fija adelante de cada registro

*/
Xinclude "arches.hW
Xdefine campo-a-buffreg (br,cad) strcat (br,cad); strcat (br,DELIM-CAD) ;

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN C: ESCR1BEREG.C

char buffreg[TAM-MAX-REG t 11;


char *solicitud[] = [
"Digite apellido, o <CR> para salir: ",
Nombre: ",
Direccibn: ",
Ciudad: ",
Estado: ",
,1
'
\
C6d. Post.: ",
,,8
/ * Cadena nula para terminar el ciclo de solicitud * /
1;
VI

5,

char
char
int
int'

respuesta[50]:
nomrch[l5]:
fd.i:
long-reg;

printf("Proporcione el nombre del archivo que quiera crear:


gets (nomrch);

");

if ((fd = creat (nomrch,PMODE)) < O) [


printf("Error en la apertura del archivo - Fin de program\n");
exit (1):
)

printf ("\n\n%sW,solicitud[Ol ) :
gets (respuesta);
while (strlen(respuesta) > O)

buffreg[O]
!\Os;
campo-a-buffreg(buffreg,respuesta);
for (i=l: *solicitud[il != '\O' ; i++)

printf("%s",solicitud[il):
gets (respuesta):
campo-aabuffreg(buffreg,respuesta);
1

/ * Escribe la longitud del registro y el contenido del buffer


long-reg = strlen(buffreg);
write (d.6long-reg.2) :
write (fd,buffreg,long-reg) ;
/ * Se prepara para los siguientes datos

*/

*/

(continuacin)

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

136

CONCEPTOS FUNDAMENTALESDE ESTRUCTURAS D E . .

p r i n t f ( " \ n \ n % s Vs ,o l i c i t u d [ O l ) ;
g e t s (respuesta) ;

/* Cierra e l archivo a n t e s de terminar * /


c l o s e ( f d );
)

/*

Preguntas:
Cmo funciona l a condicibn de terminacibn en e l c i c l o f o r :
f o r (i=l:* s o l ~ c i t u d [ i l !

: i++)
?

A qu s e r e f i e r e l a " i " ? Por que s e n e c e s i t a e l " * " ?

*/

Lee un archivo, r e g i , s t r o por r e g i s t r o , desplegando


l o s campos de cada uno de l o s r e g i s t r o s en l a p a n t a l l a

*/
Xinclude "arches.hH

i n t f d , cont-reg, cont-campos:
i n t pos-bus, long-reg;
char nomarch[l5] :
char buffreg[TAM-M-REG
11:
char campo[TAM-M-REG + 11;

p r i n t f ("Proporcione e l nombre d e l archivo a l e e r : " ) ;


g e t s (nomarch) :
i f ( ( f d = c r e a t (nomarch, SOLOLECT)) < O ) l
p r i n t f ( " E r r o r en l a apertura d e l archivo - F i n de programa\n");
e x i t (1):

1
cont-reg = 0;
pos-bus = 0 :

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN C: T0MARC.C

while

(long-reg

toma-reg (fd,buffreg) ) > 0)

printf ("Registr %d\n", ++cont-reg) ;


cont-campos %O;
while ( (pos-bus-to-campo
(campc,buffreg,pos-bus, long-reg) ) > 0)
printf ("\tCampo %d: %s\nq',
ttcont-campos. campo):
)

/*

Pregunta: Por que se puede asignar O a pos-bus s61o una vez, fuera
del ciclo while para los registros? */

/*

tomarc.c

..

Dos funciones que son empleadas en 1eereg.c y encuentra.^


toma-reg lee un registro de longitud variable del archivo fd
y lo coloca en el arreglo de caracteres buffreg.
toma-campo mueve un campo de buffreg al arreglo de caracteres
campo, insertando un '\O' para convertirlo en cadena.

*/
Xinclude "arches.hU
toma-reg (fd, buffreg)
int fd;
char buffreg [ ] ;
t
int long-reg;
if (read(fd, &long-reg, 2 ) = O /* Toma la longitud del registro */
return (0);
/* Devuelve O si EOF */
long-reg
read (d. buffreg, long-reg) ;
/* Lee el registro
return (long-reg);

tomcampo (campo,buffreg,pos-bus,long-reg)
char campo [ l . buffreg [ ] :
short po-us,
long-reg;
(

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

138

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS D E . .

/ * Posici6n en el arreglo "campo"

short c p o ~= 0;
if (pos-bus
long-reg)
return (0);
i==

*/

/ * Si no hay ms campos que leer, */


/*
devuelve pos-bus de O.
*/

/ * Ciclo de recoleccin */
while ( pos-bus < long-reg 66
(campo[cpos++l = buffreq [pos-bus++]) != DELIM-CAR)
if (campo[cpos - 11

==

campo[-cpsl = 0
else
campo[cpos] = 0

return (pos-bus) ;

DELIM-CAR)

/*

Si el ltimo
carcter es un campo * /
/* delimitador, reemplacese con nulo. */

/ * En otro caso, s61o asegrese de que


el campo no termina con nulo. * /

/* Devuelve la posicin de inicio


del siguiente campo. * /

Busca un registro con una llave en particular, en forma


secuencia1 a lo largo de un archivo.

*/
Yinclude "arches.h"
1
#define EXITO
Xdefine FRACASO O

int fd, long-req, pos-bus;


int encontr;
char llave-bus 1301, llave-enc[30], apellido[30], norbre[30];
char nomrch[l5] ;
char buffreg[TAb-MX-REGCl];
char campo [TAM-MX-REG+l] ;
pr~ntf("Proporcioneel nombre del archivo en dnde buscar: " ) :
gets (nomarch);
if ((fd = cregt (nomrch,SOLOLECT)) < O) (
pr~ntf("Err0ren la apertura del archrvo -Fin de program\n");

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN C: ENCUENTRkC

exit (1);
)

printfV\n\nDigite el apellido:
gets (apellido);

");

/ * Toma la llave de bsqueda*/

printf ("\n\nDigite el nombre: " ) ;


gets (norbre);
hazllave (apellido, nombre, llave-bus) :
encontro = FRACASO;
while (!encontr 66 (long-reg

toma-reg(fd,buffreg)) > 0 )

pos-bus = O;
pos-bus = toma-campo (apellido, buffreg, p+us,
long-reg) ;
pos-bus = tomacampo (nombre, buffreg, po-us,
long-reg) ;
hazllave (apellido, nombre, llave-enc) ;
if (strcmp(l1ave-enc, llave-bus) == 0)
encontr6 = EXITO;
)

if (encontr)
(

printf("\n\nSe encontr el registro:\n\nW);


pos-bus = O;

/* Dlvlde los campos * /


"hile( (pos-bus=toma-campo (campo,buffreg,ps-bus.long-reg)) > 0)
printf ("\t%s\nW,campo);
) else
prlntf ("\n\nNo se encontr el registro.\nq');
1

/ * Preguntas:
Por qu pos-bus se pone en cero dentro del ciclo while?
Que sucedera si se escribiese el ciclo que lee los registros

as:

while ( (long-reg

toma-reg(fd,buffreg) ) > O

&&

!encontr ) ?

*/

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

140

/*

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

hazllave (apellido,nombre,
cad)

...

Funcin que hace una llave a partir del nombre y del apellido
pasados por los argumentos de la funcin. Devuelve la llave en
f o m cannica a travs de la direccin pasada por el argumento
cad. La rutina que llama es responsable de asegurarse de que cad sea
lo suficientemente grande para guardar la cadena que se devuelve.
El valor devuelto por mdio del nombre de la funcin es la
longitud de la cadena devuelta a travs de cad.

*/
hazllave (apellido,nombre,cad)
char apellido[1, nombre [ l . cad[];
int longap, longnom;
longap = cadespac(apellldo);/*
strcpy (cad,apellido):
/*
cad[longap+t] = ' ';
/*
cad[longapl = ' \Ot:
longnom = cadespac(nombre1; / *
strcat (cad,nombre):
/*
maysculas (cad,cad) ;
/*
return (longap t longnom);

Quita los espacios del apellido */


lo coloca en la cadena de salida * /
le agrega un espacio al final
*/
Quita los espacios del nombre
lo agrega a la cadena
convierte todo a maysculas

*/
*/

*/

Mdulo que contiene las siguientes funciones:


cadespac(cad) elimina los espacios del final de la cadena
(terminada con nulo) referida por la direccin cad. La funci6n
trabaja de derecha a izquierda, eliminando los espacios hasta
que encuentra un carcter distinto de espacio. Cuando se
termina la funcin, el parmetro cad apunta a la cadena sin
espacios. Mediante su nombre, la funcin devuelve la
longitud de la cadena sin espacios.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

maysculas(cadent,cadsal) convierte todos los caracteres


alfabeticos que estan en minsculas en la cadena con
direccin cadent a maysculas, y devuelve la cadena convertida
por mdlo de la direccin cadsal.

*/
cadespac(cad)
char cad[ ] :
(

int i;

/ * Ahora que los espacios se han eliminado, se recoloca el nulo


al final para formar una cadena * /

maysculas (cadent,cadsal)
char cadent [ 1 , cadsal [ 1 ;
"hile (*cadsal++ = (*cadent >= 'a' & & *cadent <*cadent & Ox5F : *cadent )
cadent++;

'2')

Programa que abre o crea un archivo de registros de longitud


fija para hacer la actualizacin. Se debe tener acceso a los
registros que sern agregados o modificados por medio del nmero relativo de registro

*/
Xinclude "arches.hW
Xdefine LONG-FCZG 64
Xdefine campo-a-buffreg (br,cad) strcat(br,cad) ; strcat (br,DELIM-CAD) ;
statlc char

*solicitud[]

( "

"

Apellido: ",
Nombre: ",
Direccin: " ,
(continuacin)

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

142

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

Ciudad: ",
Estado: ",
Cd. Post.: ",

"
0,

1:

9,

static int fd:


static stmct (
short
contreg:
char
relleno [30]:
) encabezado;
main0 t
int i,menu-elec. nrr:
int bytegos;
char nomarch[lS]:
long lseek ( ) :
char buffreg[TAb-MAX-REG

11:

/*

buffer para guardar un registro * /

printf("Proporcione el nombre del archivo: " ) ;


gets (nomarch):
if ((fd = open(nomarch. LECTESCRIT)) < 0 ) /* Si falla OPEN

*/

fd = crear (nomarch. PMODE);


/* entonces CREAT
*/
encabezado.cont-reg = 0:
/* Inicia encabezado
*/
write(fd.&encabezado,sizeof(encabezado)); / * Escribe el reg. de
encabezado
*/
)

else
/* Se abre el archivo existente - se lee el encabezado * /
readtfd,&encabezado,sizeof (encabezado)) ;

/ * Ciclo del programa principal


las opciones */
while ( (men-elec

==

- llama al

men y despues salta a

menu ( ) ) < 3 )

switch (men-elec)

/* Agrega un registro nuevo */


case 1:
printf("Proporcione la informacin del registro nuevo -\n\nN
1:
pide-info (buffreg):
bytegos = encabezado.cont-reg
sizeof (encabezado);
lseek (fd,(long) bytegos, 0):
write (fd.buffreg,LONG-EG);
encabezado.cont-regtt;
break:
case 2:

LONG-F32G

/ * Actualiza un registro existente * /

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN C: ACTUAL1ZA.C

nrr

pide-nrr

() ;

/ * Si el NRR es muy grande, imprime mensaje de error

... */

if (nrr >= encabezado.cont-reg) (


printf("E1 nmero de registro es demsiado grande");
printf ( " . . . se vuelve al men ...*') ;
break ;

t
/ * En caso contrario, se coloca en el registro ... */
b y t e p s = nrr * LONG-PSG + sizeof(encabezado);
lseek (fd, (long) byteps, 0);
/* Lo despliega y pide los cambios

...

*/

leey-muestra ( ) ;
if (canbio( ) )
(

printf ("\n\nProporcione los valores revisados: \n\n");


pide-info (bufreg);
lseek (fd, (long) byte-pos. 0);
write (d.buffreg,LONG_REG);
1
break;
1
1

/ * Reescribe la s u m de registros correcta en el encabezado


antes de terminar */
lseek (id,OL,0);
write (d.&encabezado,sizeof (encabezado)) ;
close (fd);
1

/ * men0

...

Funcidn local que pide al usuario la siguiente operacin.


Devuelve el valor numrico de la respuesta del usuario

*/
static men() {
int eleccibn;
char respuesta [lo1 ;
printf ("\n\n\n\n
DE ACTUALIZACION DEL ARCHIVO\n");
PRprintf ("\n\nUd. Puede elegir:\n\nU);
printf("\nl. Agregar un registro al final del archivo\nW);
printf("\n2. Extraer un registro para actualizarlo\n");
printf("\n3. Salir del programa\n\nW);
printf("Proporci0ne el nmero de su eleccibn: " ) ;
gets (respuesta);

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE.. .

144

eleccin = atoi(respuesta);
return (eleccin);

/ * pide-info0

...

Funcin local que lee los campos de nombre y direccin,


transcribindolos al buffer que se pasa c o m parmetro

*/
static pide-info (buffreg)
char buffreg[l;
{

int contcampos, i;
char respuesta[501;

/* Limpia el buffer del registro */


for (i = 0; 1 < LONG-REG; buffreg[i++]

'\Oa)
1

/* Toma los campos */


for (i=O; *solicitud[i] ! = '\O'; i++)
{

printf ("%se',solicitud[i]) :
gets (respuesta);
campo-a-buffreg(buffreg,respuesta);
)

F
/ * pide-nrr 0

...

Funcin local que pide el nmero relativo del registro


que se actualizar.

*/
static pide-nrr ( )
{

int n r r :
char respuesta 1101:
~rintf("\n\nDigiteel nmero relativo del registro\nU);
printf ("\Que desee actualizar: " ) :
gets (respuesta);
nrr = atoi (respuesta);
return (nrr);
)

/ * leey-nuestra O

. ..

Funcin local que lee y despliega un registro. Ntese que esta


funcin no incluye localizacin: la lectura empieza en
la posicin actual del archivo

*/
static leey-nuestra

()

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN C: ACTUALIZ.4.C

char buffreg[TAb-MAX-REG
int pos-bus, long-datos;

+ 11, campo[TAM-MAX-REG + 11;

pos-bus = O;
readifd, buffreg, LONG-REG);
printf ("\n\n\n\nContenido del registro existente\nS');
buffreg[iONG-REG]

/*

Se asegura que el registro termine con


nulo */
long-datos = strlen (buffreg);
while ( (pos-bus=toma_campo (campo. buffreg, pos-bus, long-datos) ) > 0)
printf ("\t%s\n",campo);

/ * cambio0

...

Funcidn local que pregunta al usuario si quiere cambiar el


registro. Devuelve 1 si la respuesta es si y O en caso contrario

*/
static cambio 0 (
char respuesta(101;
printf("\n\nDesea modificar este registro?\nM);
printf ( " Conteste S o N, seguido por <ENTER> ==>") ;
gets (respuesta);
maysculas(respuesta,respuesta);

return ((respuesta[O]

==

1 : O);

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

146

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

PROGRAMAS EN PASCAL
Los programasen Pascal listadosen l a s siguientespginas corresponden

a los p r o g r a m a s analizados e n el texto. C a d a programa e s t organizado


e n u n o o m s archivos, como sigue.

Escribe la informacin de nombres y direcciones como


una secuencia de bytes consecutivos.
Lee un archivo de secuencia de bytes como entrada y lo
muestra en la pantalla.
Escribe un archivo de registros de longitud variable que
usa un contador de bytes al inicio de cada registro para
proporcionar su longitud.
Lee un archivo, registro por registro, mostrando los
campos de cada uno de los registros en la pantalla.
Funciones de apoyo para la lectura de registros o
campos individuales. Estas funciones son necesarias
para el programa 1eereg.p~~.
Busca un registro con una llave en particular en forma
secuencia1 a lo largo de un archivo.
Permite agregar registros nuevos a un archivo, o
modificar registros existentes.
FunciRn de apoyo para actualiza.pas, que convierte una
variable de tipo cadena en una variable de tipo regdato.

Adems de estos archivos, existe u n archivo llamado herramientas.prc, q u e contiene l a s h e r r a m i e n t a s p a r a t r a b a j a r con variables de
tipo cadena. Un listado de herramientas.prc aparece en el Apndice B,
al f i n a l del libro.

Se h a n agregado los nmeros de lnea a a l y n o s d e estos listadosen


Pascal, p a r a a y u d a r al lector a encontrar proposiciones de programa
especficas.
Los archivos q u e contienen funciones o procedimientos d e Pascal,
pero q u e no contienen programas principales, e s t n dados por l a extensin .prc, como en toma.prc y e n caddat.prc.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN PASCAL: ESCRIBESEC.PAS

Algunos aspectos de escribesec.pas que se deben considerar son:


El comentario [$B-1 en la lnea 6 es una directiva para el
compilador de Turbo Pascal, que indica manejar l a entrada del
teclado como un archivo estndar de Pascal. Sin esta directiva
no se podra manejar apropiadamente la funcin long-cado en el
ciclo WHILE de la lnea 36.
O El comentario ($1herramientas.prc1, en la lnea 24, es tambien
una directiva para el compilador de Turbo Pascal, para que
incluya el archivo herramientas.prc en la compilacin. Los
procedimientos l e e c a d , longcad, y escribecad estn en el
archivo herramientas.prc.
O Aunque Turbo Pascal maneja un tipo especial de cadenas, aqu
se ha preferido no usarlo, para tener mayor similitud con Pascal
estndar. En su lugar, se cre un tipo cadena propio, que es un
packed array [O..TAM-MAXREGI of char. La longitud de la
cadena se almacena en el byte cero del arreglo, como un valor de
tipo carcter. Si X es el carcter almacenado en el byte cero del
arreglo, entonces lo longitud de l a cadena e s ORD(X).
O La proposicin de asignacin de la lnea 3 1 no es estndar. Es un
procedimiento de Turbo Pascal que, en este caso, asigna un
nomarch a archivosal, de manera que todas las operaciones
siguientes sobre archivosal operen sobre el archivo del disco.
O

1: PRO-

2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:

escribesec (INPUT,OUTPUT) :

Escribe la informacin de nombres y direcciones como una secuencia


de bytes consecutivos )

{SB-)( Directiva para el compilador de Turbo Pascal, indicndole que


maneje el teclado como un archlvo estndar de Pascal )
CONST
DELIM-CAR
TAM-MAX-REG

' 1 ';
=

255;

TYPE
cadena
= packed array [O..TAM-M?&-REGI
o char;
= (apellido,nombre, direccin, ciudad,estado,codpost) ;
lista-ent
tlpoarchivo = packed array[l..40] of char;

VAR
respuesta

: array [lista-ent] o cadena:

(continuacin)

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

148

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

20:
tipo-resp : lista-ent;
21:
nomrch
: tiparchivo;
22:
archivosal : text;
23:
24: {$1 herramientas.prc)
25: ( Otra directiva que indica al compilador incluir el archivo
26:
herramientas.prc )
27:
28: BEGIN {principal}
29:
write('Proporcione el nombre del archivo: ' ) ;
30:
readln (nomarch);
31:
assign (archivosa1,nomrch)
:
32:
rewrite(archivosa1):
33:
34:
write('Digite un apellido, o <CR> para salir: ' ) :
35:
lee-cad (respuesta[apellido]1 ;
36:
while (long-cad (respuesta[apellido]) > O) DO
37:
BEGIN
38:
{ T o m todos los datos de una persona }
39:
write ( '
Nombre: ' ) ;
40:
lee-cad (respuesta[nombrel ) :
41:
write(' Direccin:'):
42:
leecad (respuesta[direcci6nlI:
43:
write ( '
Ciudad: ' ) :
lee-cad (respuesta[ciudad]) ;
44:
45:
write ( '
Estado: ' 1 ;
46:
lee-cad(respuesta [estado]) ;
47:
write('Cod. Post.: ' ) ;
lee-cad (respuesta[codpost]) ;
48:
49:
50:
{ escribe las respuestas al archivo )
51:
for tiporesp := apellido TO codpost DO
escribe-arch-cad (archivosal,respuesta [tipo-respl ) ;
52:
53:
54:
{ inicia la siguiente vuelta de lectura 1
55:
write('Digite un apellido, o <CR> para salir\n>>>');
56:
lee-cadirespuesta [apellido]) ;
57:
END;
58:
close (archivosal)
59: END.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN PASCAL: LEESEC.PAS

PRWRAM leeaec (INPUT,OUTPUT);


(

Programa que lee un archivo de secuencias de bytes [campos separados


por delimitadores) como entrada y lo despliega en la pantalla 1

CONST
DELIM-CA = ' I ';
TAM-MAX-REG = 255;
TYPE

cadena
= packed array [O..TAM-MAX-REG]
o char:
tipoarchivo = packed array[l..40] o char;
VAR
:
nomrch
archivoent :
contcampos:
long-campo :
cad
:

tlpoarchlvo:
text:
integer;
integer;
cadena;

(SI herramientas.prc1
FUNCTION leecampo(VAR archivoent: text; VAR cad : cadena): integer;
(

Funcin que lee caracteres del archivo archivoent hasta que alcanza
el final del archivo o una ' 1 ' . Leecampo pone los caracteres en cad
y devaelve la longitud de cad )

VAR
i : integer;
car : char;
BEGIN
i := O.
car : = ' ';
"hile (not EOF (archivoent)) and (car <> DELIM-W) DO
BEGIN
read (archivoent,car);
i := i + 1;
cad[i] := car
END;
i := i - 1 ;
cad[OI := CHR(i) ;
leecampo := 1
END;

(continuacin)

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

150

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

BEGIN ( principal )
write('Proporcione el norbre del archivo que quiera abrir:
readln (nomarch);
assign (archivoent,nomarch);
rest (archivoent);
cont-campos

:=

');

0;

long-campo := leecampo(archivoent,cad);
while (lonpampo > O) DO
BEGIN
cont-campos := cont-campos + 1;
write(' c a q m #':lO,cont-camps:l, ' : ' :2);
escribe-cad (cad);
( escribe-cad est en herramentas.prc
long-campo := leecampo(archivoent,cad)
END;
close (archivoent)
ENE.

Nota acerca deescribereg.pas: despus de escribir lalong-reg al archivo


de salida en la lnea 69, se escribe un espacio en el archivo. Esto se debe
a que en Pascal losvalores que se van aleer en variables enteras deben
estar separados por espacios, tabuladores, o marcas de fin de lnea.
1: PRO-

escribereg (INPUT,OUTPUT);

2:
3: (SB-)

4:
5: CONST
6:
DELIM-CAR = ' 1 ' ;
7:
TAM-MAX-FSG = 255;
8:
9: TYPE
10:
cadena
= packed array [O..TAM-MAX-FSG] of char;
11:
tipoarchivo = packed array[l. .40] o char;
12:
13: VAR

14:
15:
16:

17:
18:
19:

nomrch
archivosal
respuesta
buffer
long-reg

tipoarchivo:

: text;
:
:
:

cadena;
cadena;
integer;

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN PASCAL: ESCRIBEREG.PAS

20: (SI herramientas.prc1


21:
22:
cadena; cad: cadena);
23: PROCEDUE =aw-a-buffer(buffer:
24:
25: ( Este procedimiento concatena cad y un delimitador al final de
26:
buffer )
27:
28: VA
29:
cad-dato
: cadena;
30: BEGIN
conc-cad(buffer, cad) ;
31:
32:
cad-dato[O] := CHR(1);
33:
cad-dato[l] := DELIM-Cm;
34:
conc-cad (buffer,cad-dato)
35: END;
36:
37:
38: BEGIN (principal)
write('Proporcione el nohre del archivo que desee crear: ' ) ;
39:
40:
readln (nomarch);
41:
assign (archivosal,nomarch);
42:
rewrite (archivosal);
43:
write('D1gite el apellido - o <CR> para salir: ' ) ;
44:
45:
lee-cad(respuesta) ;
46:
while (long-cad(respuesta) > O) DO
47:
BEGIN
buffer[Ol := CHR(0);
( Hace la longltud de la
48:
49:
cadena en el buffer iqual a O )
campo-a-buffer (buffer.respuesta);
wr~te('
Nombre: ' ) ;
lee-cad(respuesta) ;
campo-a-buffer(buffer, respuesta);
Direccin: ' ) ;
write ( '
lee-cad (respuesta);
campo-a-buffer (buffer,respuesta);
Cludad: ' ) ;
urlte ( '
lee-cad (respuesta);
campo-a-buffer(buffer, respuesta);
Estado: ' ) ;
write ( '
lee-cad(respuesta) ;
campo-a-buffer (buffer,respuesta);
wrlte ( '
C6d. Post.:');
lee-cad (respuesta);
campo-a-buffer (buffer,respuesta);

(continuacin)

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

152

67:
68:
69:
70:
71:
72:
73:
74:
15:

76:
77:
78:

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS D E . .

Escribe la longitud del registro y el contenido del buffer


long-reg : - long-cad(buffer);
write(archivosa1,long~reg);
write (archivosal,' ' ) ;
escribe~arch~cad(archivosa1,buffer);

( Se prepara para el siguiente registro 1


write('Digite el apellido - o <CR> para salir:
lee-cad (respuesta)
END;
close (archivosal)
END.

O);

PROGRAM leereg (INPUT,OUTPUT);


(

Este programa lee un archivo, registro por registro,


desplegando los campos de cada uno de los registros en la pantalla. 1

TYPE
packed array [O. .TAM-MRX-REGI of char;
cadena
tipoarchivo = packed array[l..40] of char;
VAR
nomrch
:
archivosal :
cont-regs :
:
pos-bus
long-reg
:
cont-campos:
:
buffer
campo

tipoarchivo;
text;
integer;
integer;
integer;
integer;
cadena;
: cadena;

{SI herramientas.prc)
(SI toma.prc1

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN PASCAL: TOMA.PRC

BEGIN tprinclpal)
write('Proporcione el norrS3re del archivo por leer: ' 1 ;
readln (nomarch);
assign (archivosa1,nomarch);
rewrite(archivosa1);
cont-regs := 1;
pos-bus := 0:
long-reg := toma-reg(archivosal.buffer);
while long-reg > O DO
BEGIN
writeln('Reglstro ',cont-regs);
cont-regs := cont-regs t 1;
cont-campos := 1;
posbus := toma-campo(campo, buffer,pos_bus,long-reg) ;
while pos-bus > O DO
BEGIN
Campo ' , contcampos, ' : ' ) :
write ( '
escribe-cad (campo);
cont-campos := cont-campos + 1;
posbus := tomacampo(campo,buffer,pos~bus.long~reg)
END:
long-reg := toma-reg (archivosal,buffer)
END;
close (archivosal)
END.

FUNCTION toyreg(VAR fd: text: VA8 buffer: cadena):integer;


que lee un reglstro y su longxtud del archivo fd. La
funcin devuelve la longltud del registro. Toma_reg() devuelve O
si se encuentra EOF )

( Funcin

VAR

long-reg
: integer;
: char:
espacio
BEGIN
if EOF(fd) then
t o - r e g := O
else
BEGIN

(continuacin)

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

154

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

read(fd,long-reg) ;
read(fd,espacio) ;
lee-arch-cad (fd,buffer,long-regl ;
tom-reg := long-reg
END
END;
FUNCTION toma_campo(VAR campo: cadena;buffer: cadena;Var posbus: integer;
long-reg: integer):integer;
(

'

Euncin que empieza leyendo en posbus y lee caracteres del buffer


hasta que alcanza un delimitador o el final del registro. Devuelve
pos-bus para que se use en la siguiente llamada. 1

VAR
posf
: integer;
BEGIN
if posbus = long-reg then
torocampo := O
else
BEGIN
pos := 1;
posbus := posbus + 1;
campo[posf] := buffer[posbus] ;
while (camp[posf] o DELIM-CAR) and (posbus < long-reg) DO
BEGIN
pos := pos + 1;
posbus := posbus + 1:
campo [posf1 := buffer[posbus]
END;
if campo[posf]
DELIM-CAR then
campo[OI := CHR(posf - 1)
else
campo[O] := CHR(posf1;
tomacampo := posbus
END
END;

PRCGRAM encuentra (INPUT,OUTPUT);


(

Este programa lee un archivo, registro por registro,


buscando un registro con una llave en particular. Si hay correspondencia, entonces se despliegan todos los campos del registro.
De lo contrario. se despliega un mensaje de error indicando que
no se encontr el registro. 1

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN PASCAL: ENCUENTRkPAS

CONST
TAM-MAX-REG = 255;
DELIM-CA = ' 1 ' ;
TPE
cadena
tipoarchivo

packed array [O..TAM-MAX-REG] of char;


packed array[l..40] of char;

vm
iiomrch
archivosal
apellido
nombre
llave-bus
longitud
encontr
long-reg
buffer

: tipoarchivo:
: text:

: cadena:

:
:
:
:
:
:
po-UJ
:
llave-encont :
campo
:

cadena;
cadena;
integer;
boolean:
integer:
cadena;
integer:
cadena:
cadena:

($1 herramientas.prc)
(SI toma.prc)
BEGIN (principal)
write('Proporcione el nombre del archivo para bsqueda: '1:
readln (nomarch):
assign (archivosal,nomarch):
rewrite (archivosal);
write('Digite el apellido: ' ) :
lee-cad(apel1ido) ;
write ( 'Digite el nombre: ' ) ;
lee-cad(nombre) :
hazllave (apellido,nombre,llave--bus);
encontr := FALSE:
long-reg := toma-reg(archivosa1,bufferl:
while ((not encontr) and (long-reg > O)) DO
BEGIN
pos-bus := O:
pos-bus := toma-campo (apellido,buffer,p o e u s . long-regl ;
pos-bus := toma_campo (nombre,buffer,posbus,long-reg) ;
hazllave(apellido,nombre,llave-encont);

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

156

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS D E . .

if comp~cad(llave~encont,llave~bus)
= O then
encontr := TRUE
else
long-reg := toma-reg(archivosa1,buffer);
END;
close (archivosal);
( Si se encontrb el registro, se imprimen los campos 1
if encontrb then
BEGIN
writeln('Se encontr el registro:');
writeln;
pos-bus := O;
( Divide los campos ]
pos-bus := toma-campo(campo, buffer,pos-bus,long-reg) ;
while pos-bus > O DO
BEGIN
escribe-cad (campo);
posbus := toma-campo (campo,buffer,posbus,long-reg)
END;
END
else
writeln(' El registro no se encontr.');

Algunos aspectos acerca de actua1iza.pas que se deben considerar son:


O

En el procedimiento pide-infoO, los campos de nombre y


direccin se leen como cadenas, y el procedimiento
campoa-buffer0 escribe los campos a buffcad (tambikn de tipo
cadena). La escritura de buffcad a archivosal d a n a como
resultado una falta de correspondencia en los tipos, ya que
archivosal es un archivo de tipo regdato. Sin embargo, el
procedimiento caddat, localizado en caddat.prc, convierte una
variable del tipo cadena en una variable del tipo regdato para
transcribir el buffer al archivo. Las llamadas a caddatf) se
localizan en las lneas 210 y 237.
O Las proposiciones seekO de las lneas 212,229,239y 250 no son
estndar, son caractersticas de Turbo Pascal.

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN PASCAL: ACTUALIZkPAS

1: PRffiRAM actualiza (1NPUT.OUTPUT);


2:
3: ($8-1
4:
5: ( Program que abre o crea un archivo de registros de longitud
6:
fija para hacer la actualizacin. Los registros pueden agregarse
7:
o modiflcarse. A los registros por agregar o modificar
se debe tener acceso por medio del nmero relativo de registro 1
8:
9: CONST
TAM-MAX-REG = 255;
10:
11:
LONG-REG = 64;
12:
DELIM-CAF? = ' : ' ;
13:
14: TYPE
= packed array [O..TAM-MAX-FG] of char;
15:
cadena
16:
tipoarchivo = packed array [l..401 of char;
= RECORD
17:
regdato
18:
longitud : integer;
: packed array [l..XDNG-REG] of char
19:
datos
20:
END;
21:
22: VAR
23:
nomrch
: tipoarchivo;
24:
archivosal : file of regdato;
25:
respuesta : char;
men-lec
: integer;
26:
27:
buffcad
: cadena;
poeyte
: integer;
28:
29:
encabezado : regdato;
30:
nrr
: integer;
31:
regbuffdat : regdato;
32:
i
: integer:
33:
cont-regs : integer;
34: (SI herramientas.prc)
35: (SI caddat.prc)
36: (SI toma.prc)
37:
38:
39: PRCCEDURE campo-a-buffer(buffer: cadena; cad: cadena);
40:
41: ( Este procedimiento concatena cad y un delimitador al final del
42:
buffer )
43:
44: VAR
45:
cad-dato
: cadena:
46: BEGIN

(continuacin)

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE.. .

158

47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:

conc-cad ( b u f f e r , c a d ) ;
cad-dato[Ol := CHR(1) ;
cad-dato [ l l := DELIM_CAR;
conc-cad ( b u f f e r , cad-dato)
END;

FUNCTION men:integer;
( Funcin l o c a l que p i d e a l u s u a r i o l a s i g u i e n t e o p e r a c i b n .
Devuelve e l v a l o r numrico d e l a r e s p u e s t a d e l u s u a r i o )

VAR
eleccin : integer;
BEGIN
writeln;
PROGRAMA DE ACTUALIZACION DEL ARCHIVO');
writeln ( '
writeln;
w r i t e l n ('Ud. Puede e l e g i r : ' ) ;
writeln;
writeln ( '
1. Agregar un r e g i s t r o a l f i n a l d e l a r c h i v o ' ) ;
writeln ( '
2. E x t r a e r un r e g i s t r o p a r a a c t u a l i z a r l o ' ) ;
3. S a l ~ d
r e l programa');
writeln ( '
writeln;
write ( ' P r o p o r c i o n e e l nmero d e su e l e c c i n : ) ;
r e a d l n ( e l e c c i n );
writeln;
men := e l e c c i n
END;
PROCEDURE pide-info (VAR b u f f c a d : cadena) ;
( P r o c e d i m i e n t o l o c a l que l e e l o s campos d e nonbre y d i r e c c i n ,
e s c r i b i n d o l o s a l b u f f e r que se p a s a como p a r m t r o )
VAR
r e s p u e s t a : cadena;
BEGIN
( Limpia e l b u f f e r d e l r e g i s t r o 1
limpia-cad (buf f cad) ;
( Toma l o s campos )
w r i t e ('
Apellido: ' ) ;
lee-cad ( r e s p u e s t a ) ;
campo-abuffer (buffcad, respuesta) ;
write ( '
Nombre: ' ) ;
lee-cad ( r e s p u e s t a ) ;
campompoaabuf
fer(buffcad, respuesta) ;
write ( '
Direccin: ' ) ;

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN PASCAL: ACTUALIZkPAS

1-ad
(respuesta);
campo-a-buffer (buffcad,respuesta);
Ciudad:' ) ;
write ( '
lee-cad (respuesta):
campo-a-buffer (buffcad,respuesta);
Estado : ' ) ;
write ( '
1-ad(respuesta);
campo-a-buffer(buffcad, respuesta);
write ( <
Cd. Post. : * ) ;
lee-cad (respuesta);
campompoaabuffer(buffcad,respuesta);

writeln
END;

110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:

FUNCTION pide-nrr:.integer;
(

Funcin que pide el nmero relativo del registro


que se actualizar. 1

VAR

nrr
: integer;
BEGIN
writeln('Proporci0ne el nmero relativo del');
writeln('registro que desea actualizar: ' ) ;
readln (nrr);
writeln;
pide-nrr := nrr
END:
PROCEDURE l e e ~ ~ m e s t r a ;
Procedimiento para leer y desplegar un registro. Este
procedimiento no incluye localizacin: la lectura empieza
en la posicin actual del archivo 1
VAR
pos-bus
: integer;
regbuffdat : regdato;
i
: integer;
long-datos : integer;
CampO
: cadena:
buffcad
: cadena:
BEGIN
pos-bus :- O;
read(archivosa1,regbuffdat);
(

Convierte regbuffdat en tipo cadena 1

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

160

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS DE..

buffcad [O] := CHR (regbuffdat .longitud);


for i := 1 to regbuffdat.longitud DO
buffcad[i] := regbuffdat.datos[i]:
writeln('Contenido del registro existente'):
writeln;
long-datos := long-cad(buffcad):
pos-bus := to-campo
(campo,buffcad,pos-bus, long-datos) :
while pos-bus > O DO
BEGIN
escribe-Cad (campo):
pos-bus := toma-campo (campo,bufcad,pos-bus, long_datos)
END
END:

FUNCTION cambio: integer:


{

Funcin que pregunta al usuario si quiere cambiar el registro.


Devuelve 1 si la respuesta es si y O en caso contrario.

VAR
respuesta : char:
BEGIN
writeln ('Desea modificar este registro?') ;
write ( '
Conteste S o N, seguido por <ENTER> ==>'):
readln (respuesta);
writeln;
if (respuesta = 'S') or (respuesta = ' S ) then
cambio := 1
else
cambio := O
END:
BEGIN {principal)
write('Proporcione el nombre del archivo: * ) :
readln (nomarch):
assign (archivosal.nomarch):
write(' ;El archivo ya existe? (responda S o N): ' ) :
readln (respuesta):
writeln:
if (respuesta = 'S') OR (respuesta = S ' ) then
BEGIN
( Abre archivosal
)
reset (archivosal);
read(archivosa1,encabezado);
( Toma el encabezado
1
cont-regs := encabezado.longitud
[ Lee el nm. de regs. )
END

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

PROGRAMAS EN PASCAL:ACTUAUZA.PAS

189:
else
190:
BEGIN
191:
rewrite (archivosal);
( Crea arch~vosal
1
192:
cont-regs := O;
( Inicia el nm. de regs. )
193:
encabezado.longitud :- cont-regs; [ lo coloca en el reg. )
194:
for i := 1 to LONG-F?ZG DO
( de encabezado
)
195:
encabezado.datos[il := CHR(0); ( pone los datos del enc.
196:
write(archivosa1,encabezado)
( a nulo; escribe el reg. )
197:
END;
( de encabezado
1
198:
199:l Ciclo del prog. princ.-llama al men y despus salta a las ops. )
200:
men-elec := men;
201:
while men-elec < 3 DO
BGGIN
202:
203:
CASE menelec of
204:
1:
( Agrega un registro nuevo 1
205:
BEGIN
writeln('Proporcione la inf. del registro nuevo --'1;
206:
207:
writeln;
208:
writeln;
209:
pide-info (buffcad);
210:
caddat(regbuffdat,buffcad); ( Convierte cadbuff 1
211:
nrr := cont-regs + 1;
( al tipo regdatos )
212:
seek (archivosa1,nrr)
;
213:
write (archivosal,regbuffdat);
214:
cont-regs := cont-regs + 1
215:
END;
216:
2:
( Actualiza un registro existente )
217:
BEGIN
218:
nrr := pide-nrr;
219:
( Si el NRR es muy grande, imprime mensaje de error ... 1
if (nrr > cont-regs) or (nrr < 1) then
BEGIN
writeln('E1 nmero de reg. est fuera de margen');
writeln ( ' . . . se regresa al men . . . ' )
END
else ( en caso contrario, se coloca en el registro
BEGIN
seek (archivosal, nrr) ;

... 1

( Lo despliega y pide los cambios )


lee-uestra;
if cambio = 1 then
BEGIN

(continuacin)

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

Este documento es proporcionado al estudiante con fines educativos, para la crtica y la investigacin respetando la reglamentacin en materia de derechos de autor.
Este documento no tiene costo alguno. El uso indebido de este documento es responsabilidad del estudiante.

162

CONCEPTOS FUNDAMENTALES DE ESTRUCTURAS D E . .

235:
writeln('Proporcione los valores revisados: ' ) ;
236:
pide-info (buffcad):
237:
caddat (regbuffdat,buffcad) : ( Convierte buffcad
238:
al tipo regdatos 1
239:
seek (archivosal, nrr) ;
240:
write(archivosal,regbuffdat)
241:
END
242:
END
243:
END
244:
END: 1 CASE )
245:
men-elec := men
246:
END: ( while 1
247:
1
248: [ Reescribe el cont. de regs. correcto en el encab. antes de
249:
encabezado.longitud := contregs:
(
terminar
1
250:
seek (archivosal,0);
251:
write (archivosal,encabezado);
252:
close (archivosal)
253: END.

.. .

...

PRCCEDURE caddat(VAR regbuffdat: regdato: buffcad: cadena):


[

Procedimiento que convierte una variable de tipo cadena en una


variable de tipo regdatos )

VAR
i
: integer;
BEGIN
regbuffdat.1ongitud := min(L0NG-ffiG,long-cad(buffcad));
for i := 1 to regbuffdat.1ongitud DO
regbuffdat.datos[i] := buffcad[il:
( Limpia el resto del buffer )
while i < LONG-REG DO
BEGIN
i := i + 1:
regbuffdat.datos[i] := ' *
END
END;

J. Folk, M. y B. Zoellick. (1992). Conceptos fundamentales de estructuras de archivos. En Estructuras de archivos (pp. 90-145). EUA: Addison-Wesley Iberoamericana.

You might also like