SISTEMAS DE ARCHIVOS
El
“Sistema de Archivos” es la parte del sistema de administración del
almacenamiento responsable, principalmente, de la administración de los
archivos del almacenamiento secundario.
Es la parte del S. O. responsable de permitir “compartir controladamente” la información de los archivos.
Función
de sistemas de archivos
Los usuarios deben poder crear, modificar
y borrar archivos.
Se deben poder compartir los archivos de
una manera cuidadosamente controlada.
El mecanismo encargado de compartir los
archivos debe proporcionar varios tipos de acceso controlado:
Ej.: “Acceso de Lectura”, “Acceso de
Escritura”, “Acceso de Ejecución”, varias combinaciones de estos, etc.
Se debe poder estructurar los archivos de
la manera más apropiada a cada aplicación.
Los usuarios deben poder ordenar la
transferencia de información entre archivos.
Se deben proporcionar posibilidades de
“respaldo” y “recuperación” para prevenirse contra:
La pérdida accidental de información.
La destrucción maliciosa de información.
Se debe poder referenciar a los archivos
mediante “Nombres Simbólicos”, brindando “Independencia de Dispositivos”.
En ambientes sensibles, el sistema de
archivos debe proporcionar posibilidades de “Cifrado” y “Descifrado”.
El sistema de archivos debe brindar una
interfase favorable al usuario:
Debe suministrar una “visión lógica” de
los datos y de las funciones que serán ejecutadas, en vez de una “visión
física”.
El usuario no debe tener que preocuparse
por:
Los dispositivos particulares.
Dónde serán almacenados los datos.
El formato de los datos en los
dispositivos.
Los medios físicos de la transferencia de
datos hacia y desde los dispositivos
ARCHIVO
Es
una colección de registros lógicamente relacionados. , un registro es una estructura de campos o de
elementos de información lógicamente
relacionados. Por lo regular todos los archivo tienen un formato único, que
aunque estudiaremos algunos ejemplos de archivos con múltiples
formatos de registro. Generalmente, los registros de un archivos se almacenan juntos para algún propósito común, por
ejemplo, apoyar un proceso de nomina o
registrar percepciones y descuentos al sueldos
de empleados o contener la información de inventarios, recolectar datos para un experimento científico, o un
modelo desarrollado utilizando un sistema de diseño asistido por computadora.
Los archivos grabados en cintas o discos
magnéticos pueden ser guardados en cintotecas y posteriormente recuperados para
ser accesados por programas y usuarios que los demanden.
ATRIBUTOS DE ARCHIVO
Cada archivo tiene:
Su nombre y datos.
Elementos adicionales llamados atributos, que
varían considerablemente de sistema a sistema.
Algunos de los posibles atributos de archivo
son [23, Tanenbaum]:
“Protección”: quién debe tener acceso y de qué
forma.
“Contraseña”: contraseña necesaria para acceder
al archivo.
“Creador”: identificador de la persona que creó
el archivo.
“Propietario”: propietario actual.
“Bandera exclusivo - para - lectura”: 0 lectura
/ escritura, 1 para lectura exclusivamente.
“Bandera de ocultamiento”: 0 normal, 1 para no
exhibirse en listas.
“Bandera de sistema”: 0 archivo normal, 1
archivo de sistema.
“Bandera de biblioteca”: 0 ya se ha respaldado,
1 necesita respaldo.
“Bandera ascii / binario”:
0 archivo en ascii, 1 archivo en binario.
“Bandera de acceso aleatorio”: 0 solo acceso
secuencial, 1 acceso aleatorio.
“Bandera temporal”: 0 normal, 1 eliminar al
salir del proceso.
“Banderas de cerradura”: 0 no bloqueado,
distinto de 0 bloqueado.
“Longitud del registro”: número de bytes en un
registro.
“Posición de la llave”: ajuste de la llave
dentro de cada registro.
“Longitud de la llave”: número de bytes en el
campo llave.
“Tiempo de creación”: fecha y hora de creación
del archivo.
“Tiempo del último acceso”: fecha y hora del
último acceso al archivo.
“Tiempo de la última modificación”: fecha y
hora de la última modificación al archivo.
“Tamaño actual”: número de bytes en el archivo.
“Tamaño máximo”: tamaño máximo al que puede
crecer el archivo.
ESTRUCTURA DE UN ARCHIVO
Los archivos se pueden estructurar de varias
maneras, las más comunes son:
“Secuencia de bytes”:
El archivo es una serie no estructurada de
bytes.
Posee máxima flexibilidad.
El S. O. no ayuda pero tampoco estorba.
“Secuencia de registros”:
El archivo es una secuencia de registros de
longitud fija, cada uno con su propia estructura interna.
“Árbol ”:
El archivo consta de un árbol de registros, no
necesariamente de la misma longitud.
Cada registro tiene un campo key (llave o
clave) en una posición fija del registro.
El árbol se ordena mediante el campo de clave
para permitir una rápida búsqueda de una clave particular.
CLASIFICACIÓN DE ARCHIVOS POR FUNCIÓN
Existen seis tipos básicos de
archivos, clasificados por la función que desempeñan en un sistema de
información:
1.-
Un archivo maestro: representa una visión estática de algún aspecto de los negocios de una organización
en un momento dado. Por ejemplo una organización de manufactura puede tener un archivo maestro de nomina, un
archivo maestro de clientes, un archivo
maestro de personal, un maestro de inventario, de requerimiento de material y
otros.
2.-
Un archivos de tracciones: una
transacción puede contener datos para agregar un nuevo registro o para
borra o modificar un registro existente
en un archivo maestro. Cada registro en un
archivo de transacciones representa un
evento o cambio de alguna cosa, cuyo estatus es registrado en un archivo
maestro.
3.-
Un archivo de reporte: contiene
datos que son formateados para su presentación
al usuario. El archivo puede enviarse a la cola de impresión para ser
impreso, o bien puede exhibirse en la pantalla de una terminal. Un paquete escritor
de reporte o un programa de aplicación
puede producir un archivo de reporte.
4.-
Un archivo de trabajo: es un archivo
temporal en el sistema. No tiene las características de entrada/salida de un
archivo de transacciones o de reporte, ni las de largo plazo del archivo
maestro. El archivo de trabajo se usa comúnmente para pasar datos creados por
un programa.
5.- Un archivo de programa: contiene instrucciones para procesar datos, los cuales pueden
almacenarse en otros archivos o residir
en la memoria principal. Las instrucciones pueden estar escritas en un
leguajes de alto nivel (por ejemplo cobol y pascal), en lenguaje ensamblador, el lenguaje máquina o en un
lenguaje de control de tareas. Las instrucciones pueden estar bajo la forma de
código fuente o pueden ser le resultado de una compilación de un ligado de una interpretación o de otro proceso.
6.- Un archivo de texto: contiene datos alfanuméricos y
gráficos ingresados a través de un programa editor de textos. Se pueden procesar un archivo texto solamente por ese editor de
texto, o se podría almacenar de tal forma que pueda procesarse por varios
editores.
Considere el sistema ejemplificado en el diagrama de flujo de la figura
10-1- este sistema es un sistema
rudimentario de nomina que eventualmente produce cheques de pago a partir de las tarjetas del empleado y de
información de nomina. La siguiente tabla
muestra los nombres de cada archivo y su función en el sistema de información. La
ejecución real de este sistema
generalmente puede involucra el uso de
otros archivos que contengan, por ejemplo, datos del sistema de auditoria, diagnósticos,
datos de contabilidad, códigos del
programa ejecutable, e instrucciones de control de tareas.
ARCHIVO |
FUNCIÓN |
TARJETAS DE ASISTENCIA |
TRANSACCIÓN |
PROGRAMA PARA ORDENAR |
PROGRAMA |
ARCHIVO DE TRABAJO PARA EL ORDENAMIENTO |
TRABAJO |
TARJETAS DE ASISTENCIA ORDENADAS |
TRANSACCIÓN |
ARCHIVO MAESTRO DE NOMINA |
MAESTRO |
PROGRAMA DE ACTUALIZACIÓN DE REGISTRO DE PAGO |
PROGRAMA |
TARJETA DE ASISTENCIA RECHAZADAS |
TRABAJO |
DETALLE DE CHEQUE DE PAGO |
TRABAJO |
DETALLE DE CONCILIACIÓN |
TRABAJO |
PROGRAMA DE LISTA UTILIDADES |
PROGRAMA |
REPORTE DE RECHAZOS |
REPORTE |
PROGRAMA PARA IMPRIMIR CHEQUES DE PAGO |
PROGRAMA |
CHEQUES DE PAGO |
REPORTE |
PROGRAMA PAR
IMPRIMIR REPORTE DE
CONCILIACIÓN |
PROGRAMA |
REPORTE DE
CONCILIACIÓN |
REPORTE |
ACCESO A UN ARCHIVO
Los tipos de acceso más conocidos son:
Acceso Secuencial: el proceso lee en orden
todos los registros del archivo comenzando por el principio, sin poder:
Saltar registros.
Leer en otro orden.
Acceso Aleatorio: el proceso puede leer
los registros en cualquier orden utilizando dos métodos para determinar el
punto de inicio de la lectura:
Cada operación de lectura (read) da la
posición en el archivo con la cual iniciar.
Una operación especial (seek) establece la
posición de trabajo pudiendo luego leerse el archivo secuencialmente.
Otra forma de clasificar el uso de un archivo en un sistema de información es de
acuerdo con la manera en la cual un
programa particular accesa el archivo.
Existen tres modos posibles de acceso de
un programa a un archivo:
ü
ENTRADA
ü
SALIDA
ü
ENTRADA/SALIDA
Un archivo de entrada es escritor solamente por un programa, es
decir, es creado por el programa. Por ejemplo, un archivo de reporte
puede se la salida de un programa
que actualiza un archivo maestro.
Un archivo de programa den código/objeto es un archivo de salida de
programa compilador.
Un archivo de entrada/salida es leído y escrito
durante la ejecución de un programa. Por ejemplo, el archivo maestro de nomina
podría ser usado por el programa de
nomina tanto ser leído, como una fuente de información sobre los sueldo
del empleado, como para registra los pagos totales mensuales y anuales a
la fecha. Un archivo de entrada/salida se podría crear por alguna
fase de programa. Un archivo maestro es normalmente un archivo de entrada/salida como los son los archivos de trabajo de los
programas de ordenamiento.
ORGANIZACIONES DE ARCHIVOS
La técnica utilizad para representar y almacena registro en archivos e llamada
organización de archivos. Las cuatro técnicas fundamentales de organización de
archivos son:
ü
Secuénciales
ü
Relativa
ü
Secuencial indexado
ü
Multi-llave
Hay
dos aspectos básicos en que difieren las técnicas de organización de archivos.
Primero, la organización determina la secuenciación de los registro del
archivo, la cual es la ordenación física de los registro almacenados.
Los discos
magnéticos son un ejemplo de
dispositivos de almacenamiento de acceso
directo. Las cintas magnéticas son ejemplos
de dispositivos de almacenamiento
secuencial.
OPERACIONES SOBRE ARCHIVOS
Las operaciones básicas que se ejecutan sobre los archivos son las siguientes:
1.- creación
2.- Actualización, incluyendo:
Inserción de registro
Modificación de registro
Supresión de registro
3.- Recuperación, incluyendo:
Consulta
Generación de reportes
4.- Mantenimiento, incluyendo:
Estructuración
Reorganización
CREACIÓN DE UN ARCHIVO
La creación inicial de un archivo es conocida también con la carga del archivo. El
grueso del trabajo es la creación de
archivos de transacción y archivos
maestros incluye la captura y validación de datos. En algunas implantaciones, primero se asigna el espacios
para el archivo y después los datos son cargados dentro de ese esqueleto de
archivo. En otras implantaciones, el archivo se construye registro por
registro. En muchos casos, los datos se cargan
e n un archivo de transacciones o archivo maestro por lotes,
que cuando el archivo realmente se construya
registro por registro. Carga un
archivo maestro interactivamente puede tomar demasiado tiempo
y mucho trabajo si el volumen de datos
es muy grande.
El contenido de un archivo maestro
representa un momento transitorio del mundo real representado por el archivo. Por el
ejemplo, el archivo maestro nomina,
representa el estado actual de la situación de la nómina de una compañía por
ejemplo campos mensuales y anúdeles a la fecha
indican apropiadamente cantidades
de pago acumuladas, vacaciones tomadas, vacaciones
por tomar, etc., para cada empleado.
RESPALDO Y RECUPERACIÓN
La destrucción de la información, ya sea
accidental o intencional, es una realidad y tiene distintas causas [7, Deitel]:
Fallas de hardware y de software.
Fenómenos meteorológicos atmosféricos.
Fallas en el suministro de energía.
Incendios e inundaciones.
Robos, vandalismo (incluso terrorismo).
Etc.
Esta posible destrucción de la información
debe ser tenida en cuenta por:
Los sistemas operativos en general.
Los sistemas de archivos en particular.
Una técnica muy usada para asegurar la
disponibilidad de los datos es realizar respaldos periódicos:
Hacer con regularidad una o más copias de
los archivos y colocarlas en lugar seguro.
Todas las actualizaciones realizadas luego
del último respaldo pueden perderse.
Otra técnica es pasar todas las
transacciones a un archivo, copiándolas en otro disco:
Genera una redundancia que puede ser
costosa.
En caso de fallas en el disco principal,
puede reconstruirse todo el trabajo perdido si el disco de reserva no se dañó
también.
También existe la posibilidad del respaldo
incremental:
Durante una sesión de trabajo los archivos
modificados quedan marcados.
Cuando un usuario se retira del sistema
(deja de trabajar), un proceso del sistema efectúa el respaldo de los archivos
marcados.
Se debe tener presente que es muy difícil
garantizar una seguridad absoluta de los archivos.
ARCHIVO DE TEXTO Y BINARIO
Básicamente
se puede hablar de dos tipos de fichero en Internet:
de texto y binario. Los archivos de texto utilizan caracteres ASCII y pueden
ser visualizados y modificados en cualquier programa de cualquier sistema
operativo que sea un editor de textos simple, como el Bloc de notas en Windows,
Simpletext en Macintosh o Vi
en Unix. En cambio, los archivos binarios contienen
información más compleja que no puede ser leída por un programa editor de
texto. Si abrimos un archivo binario en un editor de texto, lo que veremos son
signos extraños que no se corresponden con el contenido real de ese archivo.
.htm/.html: archivos
escritos con Lenguaje de marcas de hipertexto (Hipertext
Markup Language). Requiere
un programa visualizador de páginas web para poder
ser visto correctamente, pero puede ser modificado por un programa editor de
texto.
.txt: archivo de texto plano. Pueden ser
vistos por todos los programas editores y procesadores de texto, e incluso con
algunos otros, ya que se trata de uno de los formatos más universales.
Documentos
con formato
.doc: se trata de un documento de texto con
formato que fue creado con un procesador de texto como Word. Sólo puede
ser visualizado correctamente con este programa o con otro que tenga una serie
de filtros adecuados. Tipo de archivo: texto, pero como decimos, al tener
formato no puede ser visualizado en cualquier editor de texto.
.pdf: Portable Document Format. Archivo creado
con Adobe Acrobat, un programa de Adobe Systems que permite que documentos formateados, incluyendo
folletos u otra clase de impresos con contenido gráfico, puedan pasar de un
sistema a otro sin cambiar la disposición de los elementos. Requiere el
programa Adobe Acrobat Reader,
que existe en versiones para Windows, Mac y Unix. Cualquier documento creado con Adobe Acrobat tendrá el mismo aspecto se abra en el sistema
operativo que se abra. Formato binario
.ps: archivo PostScript.
Es un archivo ASCII, pero también con un formato especial que lo hace ilegible,
excepto para impresoras PostScript. El lenguaje PostScript se desarrolló en los primitivos editores de
texto para poder imprimir con el formato adecuado (tipo, tamaño, disposición, etc.). Estos archivos pueden ser visualizados, no obstante
por algún programa visualizador en pantalla. De hecho, dentro de los sistemas Unix no es extraño encontrar documentos de información
general en este formato.
.wp/.wpd: archivo de
texto con formato de WordPerfect. Al igual que el
archivo .doc sólo puede ser visualizado con este
programa o con otro que disponga de los filtros adecuados.
Archivos
comprimidos y/o codificados
Cuando hablamos de archivos comprimidos nos referimos al hecho de que a partir
de un archivo concreto creado en un formato determinado, hemos creado otro
archivo que contiene la misma información que el original, pero ocupando menos
espacio de disco, y por lo tanto, permitiendo una transmisión más rápida a
nuestros ordenadores. Para poder extraer la información original del archivo
debemos disponer de un programa adecuado que devuelva a los archivos
comprimidos su formato y su tamaño original. Existe también la posibilidad de
crear archivos comprimidos autoextraíbles que
aparentemente son programas ejecutables, pero que, en realidad sólo permiten la
extracción del archivo original que está comprimido, sin necesidad de tener
otros programas externos al propio archivo. Por otra parte, un archivo
comprimido puede contener, a su vez, varios archivos independientes que han
sido unidos para evitar una descarga incompleta, generalmente.
.arc:
es un formato de compresión bastante antiguo y hoy en desuso. Formato binario.
.arj: archivo comprimido en formato arj, usado, sobre todo en MS-DOS.
.bin: archivo codificado binario para
Macintosh. Es necesario un programa como Stuffit Expander.
.exe: en general, un archivo terminado en exe es un ejecutable, es decir, un programa o aplicación
con unas funciones determinadas, pero cuando nos referimos a un archivo exe dentro del apartado de los archivos comprimidos,
estamos hablando de un archivo autoextraíble para
MS-DOS o Windows. La única manera de saber si se trata de un ejecutable o de un
fichero comprimido autoextraíble es abrirlo. Por
supuesto, siempre que no contemos con otra información que nos indique de qué
clase de fichero se trata. Formato Binario.
.gz/.gzip: archivo
comprimido mediante un programa que utiliza el algoritmo
de compresión del GNU project (Proyecto para
desarrollar software que no pertenezca a ninguna empresa determinada y con la
posibilidad de que cada usuario modifique lo que desee del código fuente del
programa). Se usa sobre todo en plataformas Unix,
Linux y también PC.
.hqx: formato de codificación común para
Macintosh. Se trata no tanto de un formato de compresión como de un formato que
transforma un archivo binario en texto ASCII para poder ser transferido con
seguridad por la red. Formato binario.
.rar: formato de compresión que permite la
subdivisión, a su vez, en varios paquetes de tamaño determinado de cualquier
archivo. Se usa sobre todo en la red para que archivos que ocupan varios megas
puedan ser transferidos por partes en sesiones diferentes. Plataforma PC.
Formato binario.
.sit: archivo Macintosh que ha sido comprimido
con el programa Stuffit. Formato binario.
.sea: archivo comprimido autoextraíble para
Macintosh. Formato binario.
.tar/.tar.gz/.tar.Z/.tgz: la terminación .tar por sí sola nos indica un archivo que no está
comprimido, sino que está compuesto de varias partes que han sido unidas en un
solo archivo. Por este motivo se suelen comprimir estos archivos además con gzip con lo que tenemos un archivo múltiple comprimido.
Este tipo de compresión es usual en Unix y Linux.
.uu: archivo uuencode,
una de las formas de codificar archivos binarios en texto para ser
transferidos a través de la red. Antes era necesario disponer de un programa
específico que descodificara la cadena de texto para poder visualizar el
archivo original, pero ahora es habitual que los propios programas clientes de
correo electrónico o de news realicen la conversión
automáticamente.
.Z: archivo comprimido UNIX. Formato binario.
.zip: archivo comprimido para PC. Se utiliza WinZip para poder descomprimirlo.
Los programas descompresores de archivos suelen manejar varios de los formatos
anteriormente expuestos. Por ejemplo, WinZip en las
plataformas Windows o Stuffit en Macintosh. Sin
embargo hay formatos que no pueden abrirse con estos programas por lo que
tendremos que acudir a un programa específico en esos casos.
Archivos
de gráficos
.gif: formato de archivo gráfico comprimido
desarrollado por Compuserve para Internet. Por sus
características es mejor para aquellos gráficos que estén compuestos de colores
planos y trazados lineales. Es posible crear pequeñas animaciones en este
formato. Formato binario.
.jpg/.jpeg: formato
de archivo gráfico comprimido desarrollado por la ISO (Organización
Internacional de Estandarización) para imágenes fijas. Funciona muy bien con
imágenes de colores complejos (fotografías). Formato binario.
.tiff: formato de imagen de alta resolución y
de gran tamaño. No suele usarse en Internet, pero es
muy popular.
Casi todos los formatos de archivo gráfico pueden ser visualizados en programas
como Photoshop. También existen pequeñas aplicaciones
para visualizar y modificar formatos concretos.
Archivos
de sonido
.au/.uLaw/.MuLaw: formato de sonido usado en
Internet.
Tipo binario.
.aiff: formato de sonido típico de Macintosh,
pero que también puede ser reproducido en PC. Binario.
.mp3: formato de sonido comprimido, el más popular actualmente en la
Red. Permite distribuir archivos de alta calidad de sonido con un tamaño muy
reducido. Binario.
.ra/.ram: formato de
archivo Real Audio,. Creado por la empresa RealNetworks. Permite la transmisión de audio y video a
través de Internet en tiempo real, si bien también
pueden codificarse archivos en este sistema. Binario.
.wav: formato de sonido nativo para Windows,
si bien puede ser reproducido en otras plataformas como Macintosh. Binario.
Archivos
de vídeo
.avi: formato de vídeo nativo de Windows.
Binario
.mov/.movie: formato
para películas Quicktime. Desarrollado en principio
para plataformas Macintosh, se ha convertido en un estándar para la transmisión
de películas en Internet para otras plataformas. Binario.
.mpg/.mpeg: formato estándar para películas también
usado en Internet. Desarrollado, al igual que el jpeg
por la ISO. Actualmente la norma mpeg acaba de
desarrollar el mpeg4. Binario.
.qt: otra extensión posible para las películas
quicktime. Binario.
Los tipos de archivo que hemos visto aquí no son todos los que existen. Cada
programa crea su propia extensión para poder identificar los archivos creados,
de manera que el sistema operativo sepa qué aplicación debe abrir al hacer
doble clic sobre un documento o archivo. Sin embargo hemos presentado
aquellos tipos de archivo que, por su uso, son más comunes en Internet.
En
general, cuando en Internet nos encontremos con un archivo sin extensión,
supondremos que su formato es .txt, si bien esto no
es una norma.
Si
eliminamos la extensión de un archivo, este permanece intacto en el formato en
que fue creado. Lo único que ocurre es que el sistema operativo no sabrá por sí
mismo qué aplicación debe abrir para visualizar o modificar el archivo y
tendremos que ser nosotros los que, desde la aplicación correspondiente abramos
el documento. Esto nos ofrece una interesante manera de proteger nuestros
documentos: si eliminamos la extensión de un archivo o le colocamos otra
diferente de su formato original, quien desee abrir dicho documento se
encontrará con que, si no sabe con qué programa se creó, no podra
abrirlo.
Archivos binarios:
ARCHIVO DE ACCESO ALEATORIO
Los archivos de acceso aleatorio son más versátiles, permiten acceder a
cualquier parte del fichero en cualquier momento, como si fueran arrays en memoria. Las operaciones de lectura y/o escritura
pueden hacerse en cualquier punto del archivo.
En general se suelen establecer ciertas normas para la creación, aunque
no todas son obligatorias:
Abrir el archivo en un modo que te permita leer y escribir. Esto no es
imprescindible, es posible usar archivos de acceso aleatorio sólo de lectura o
de escritura.
Abrirlo en modo binario, ya que algunos o todos los campos de la
estructura pueden no ser caracteres.
Usar funciones como fread y fwrite, que permiten leer y escribir registros de longitud
constante desde y hacia un fichero.
Usar la función fseek para situar el puntero
de lectura/escritura en el lugar apropiado de tu archivo.
Por ejemplo, supongamos que nuestros registros tienen la siguiente estructura:
struct stRegistro {
char Nombre[34];
int dato;
int matriz[23];
} reg;
Teniendo en cuenta que los registros empiezan a contarse desde el cero,
para hacer una lectura del registro número 6 usaremos:
fseek(fichero, 5*sizeof(stRegistro), SEEK SET);
fread(®, sizeof(stRegistro), 1, fichero);
Análogamente, para hacer una operación de escritura, usaremos:
fseek(fichero, 5*sizeof(stRegistro), SEEK SET);
fwrite(®, sizeof(stRegistro), 1, fichero);
Muy importante: después de cada operación de lectura o escritura, el
cursor del fichero se actualiza automáticamente a la siguiente posición, así
que es buena idea hacer siempre un fseek antes de un fread o un fwrite.
En el caso de streams, la forma de trabajar
es análoga:
fichero.seekg(5*sizeof(stRegistro),
ios::beg);
fichero.read(®, sizeof(stRegistro));
Y para hacer una operación de escritura, usaremos:
fichero.seekp(5*sizeof(stRegistro),
ios::beg);
fichero.write(®, sizeof(stRegistro));
Calcular la longitud de un fichero
Para calcular el tamaño de un fichero, ya sea en bytes o en registros
se suele usar el siguiente procedimiento:
long nRegistros;
long nBytes;
fseek(fichero, 0, SEEK_END); // Colocar el cursor al final del fichero
nBytes = ftell(fichero); // Tamaño en bytes
nRegistros = ftell(fich)/sizeof(stRegistro); // Tamaño en
registros
En el caso de streams:
long nRegistros;
long nBytes;
fichero.seekg(0, ios::end); // Colocar el cursor al final del fichero
nBytes = fichero.tellg(); // Tamaño en bytes
nRegistros = fichero.tellg()/sizeof(stRegistro); // Tamaño en registros
Borrar registros
Borrar registros puede ser complicado, ya que no hay ninguna función de
librería estándar que lo haga.
Es su lugar se suele usar uno de estos dos métodos:
Marcar el registro como borrado o no válido, para ello hay que añadir
un campo extra en la estructura del registro:
struct stRegistro {
char Valido;
// Campo que indica si el registro es válido
char Nombre[34];
int dato;
int matriz[23];
};
Si el campo Valido tiene un valor prefijado, por ejemplo 'S' o ' ', el registro es válido. Si tiene un valor prefijado, por
ejemplo 'N' o '*', el registro será inválido o se considerará borrado.
De este modo, para borrar un registro sólo tienes que cambiar el valor
de ese campo.
Pero hay que tener en cuenta que será el programa el encargado de
tratar los registros del modo adecuado dependiendo del valor del campo Valido,
el hecho de marcar un registro no lo borra físicamente.
Si se quiere elaborar más, se puede mantener un fichero auxiliar con la
lista de los registros borrados. Esto tiene un doble propósito:
Que se pueda diseñar una función para sustituir a fseek() de modo que se
tengan en cuenta los registros marcados.
Que al insertar nuevos registros, se puedan sobrescribir los
anteriormente marcados como borrados, si existe alguno.
Hacer una copia del fichero en otro fichero, pero sin copiar el
registro que se quiere borrar. Este sistema es más tedioso y lento, y requiere
cerrar el fichero y borrarlo o renombrarlo, antes de poder usar de nuevo la
versión con el registro eliminado.
Lo normal es hacer una combinación de ambos, durante la ejecución
normal del programa se borran registros con el método de marcarlos, y cuando se
cierra la aplicación, o se detecta que el porcentaje de registros borrados es
alto o el usuario así lo decide, se "empaqueta" el fichero usando el
segundo método.
Ficheros
indicados no ordenados: árboles binarios
Para evitar tener que reconstruir el
fichero de índices cada vez que se actualiza el archivo de datos existen varios
métodos. Veremos ahora cómo implementar árboles binarios.
Para ello construiremos una estructura en
árbol mediante una tabla almacenada en un archivo de disco.
La estructura para cada nodo del árbol es
una extensión de la que usamos en el capítulo anterior, tan sólo añadiremos dos
campos extra para apuntar a otros nodos:
struct stNodo {
char telefono[10];
long indice;
long menor, mayor;
};
Crearemos el fichero de índices
estructurados en árbol a partir del archivo de datos, asignando a cada registro
el campo "telefono" y el número de registro
correspondiente y añadiendo los enlaces a otros nodos. Veamos un ejemplo:
000: [Fulanito] [Pérez] [Sanchez] [12345678] [Mayor] [15] [Lisboa] [19540425] [S]
[0]
001: [Fonforito]
[Fernández] [López] [84565456] [Baja] [54] [Londres]
[19750924] [C] [3]
002: [Tantolito]
[Jiménez] [Fernández]
[45684565] [Alta] [153] [Berlín] [19840628] [S] [0]
003: [Menganito] [Sanchez]
[López] [23254532] [Diagonal] [145] [Barcelona] [19650505] [C] [1]
004: [Tulanito]
[Sanz] [Sanchez] [54556544] [Pez] [18] [Dublín]
[19750111] [S] [0]
Veremos cómo se actualiza el fichero de
índices a medida que insertamos registros en el archivo de datos:
Paso uno:
[12345678][000][---][---]
Paso dos:
[12345678][000][---][001] <--
[84565456][001][---][---]
Paso tres:
[12345678][000][---][001]
[84565456][001][002][---] <--
[45684565][002][---][---]
Paso cuatro:
[12345678][000][---][001]
[84565456][001][002][---]
[45684565][002][003][---] <--
[23254532][003][---][---]
Paso cinco:
[12345678][000][---][001]
[84565456][001][002][---]
[45684565][002][003][004] <--
[23254532][003][---][---]
[54556544][004][---][---]
Como puede observarse, cada vez que se
inserta un registro de datos, tan sólo hay que insertar un registro de índice y
modificar otro.
Eliminar registros
Supongamos que queremos eliminar un
registro de datos. En el archivo de datos simplemente lo marcamos como borrado.
En teoría, mientras el registro no se elimine físicamente, no será necesario
eliminar el registro de índice asociado. Simplemente estará apuntando a un
registro marcado como borrado. Posteriormente, cuando purguemos el archivo de
datos será necesario reconstruir el fichero de índices.
Duplicación de claves
No hay inconveniente en almacenar
registros con claves duplicadas, tan sólo habrá que tener en cuenta que
tendremos que almacenar un nodo para cada uno de ellos. Tomaremos un criterio
para el árbol, la rama 'menor', y pasará a ser la rama 'menor o igual'.