La primera opción de almacenamiento digital que se empleo fueron los archivos de acceso secuencial, ficheros con una cierta estructura para almacenar los datos pero muy lejos todavía de las bases de datos.
Pongámonos al inicio de la segunda mitad del siglo XX, cuando nuestro protagonista Antonio comienza a pasar a formato digital los datos de su tienda SuperGades. La opción que por entonces tiene disponible es sencillamente pasar los datos de un fichero en papel a un fichero digital, empleando un procesador de textos muy sencillo con muy pocas funcionalidades, en el que escribiríamos los datos sin ningún tipo de formato. A este fichero, se le denomina también archivo, tomando el nombre de su antecedente analógico, un fichero físico con cajones donde guardábamos las fichas con los datos. Si estuviéramos almacenando los datos de los proveedores, el archivo podría tener un aspecto similar a:
Frutas Gutierrez
Antonio Gutierrez
607454545
Hortalizas del Sur
Guillermo Morales
652854874
Azucarera Sevillana
Rodrigo Mendez
622525885
En este archivo hemos escrito los datos de nuestros proveedores uno detrás de otro, como lo haríamos en un cuaderno. Hemos generado un archivo secuencial, que recibe este nombre porque los datos se almacenan uno detrás de otro, y el acceso a los mismos será de forma secuencial, es decir, tengo que recorrer el archivo desde el principio hasta llegar al dato que quiero recuperar.
Tabla de contenidos
La marca EOF (End of File)
Esta manera de trabajar obligaba a incluir algún tipo de marca que nos indicara que habíamos llegado al final del archivo, de otro modo, obtendríamos un error al intentar leer un dato más allá del final del archivo. Esta marca es el carácter de final de archivo EOF.
Cuando escribíamos datos en el archivo, al cerrar el mismo, se añadía de manera automática este carácter al final del archivo.
Los lenguajes de programación emplean el carácter EOF en los procesos de lectura de datos. Van recorriendo el archivo de forma secuencial, línea a línea, dentro de un bucle hasta leer la marca EOF.
Limitaciones de los archivos secuenciales
El uso de archivos secuenciales para el manejo de datos presenta muchas limitaciones:
Acceso secuencial: como ya he mencionado antes, el acceso a los datos era secuencial, teníamos que recorrer todo el fichero desde su primera línea hasta llegar al dato que queríamos recuperar. Esta era la única manera de movernos por el archivo, siempre se avanzaba a leer la línea siguiente, no se podía retroceder, si queríamos recuperar un dato que ya habíamos pasado, teníamos que comenzar la lectura secuencial desde la primera línea.
Modos de apertura: Al acceder al fichero para trabajar con él, lo tenemos que abrir en modo de escritura o lectura, dependiendo de la operación que queramos realizar. Para cambiar de operación tenemos que cerrar el fichero y abrirlo de nuevo en el modo correspondiente.
Las lecturas pueden ser parciales, sin embargo las escrituras tienen que se completas. Cuando abrimos un fichero secuencial en modo escritura estamos borrando todo su contenido anterior. Por ejemplo, cuando queremos borrar un registro, lo que hacemos es reescribir el fichero completo, salvo el registro que queremos eliminar.
Algunos lenguajes de programación, permiten escribir a continuación del final de fichero. Un comando muy habitual para realizar esta función es Append.
Acceso exclusivo: Solamente un usuario puede trabajar sobre el fichero en un determinado momento, para que un nuevo usuario pueda acceder al fichero, el usuario actual tendría que cerrarlo antes. En otras palabras, no es posible que varios usuarios accedan al fichero de manera simultanea.
Estructura fija de campos: El propio funcionamiento de este tipo de archivos, nos obliga a manejar una estructura fija de datos. En el archivo ejemplo de proveedores primero guardábamos el nombre de la empresa, luego el nombre de la persona de contacto y finalmente el número de teléfono.
Cuando recorremos el fichero, sencillamente leemos datos, pero no sabemos que dato estamos leyendo. De esta forma, si cambiáramos accidentalmente el orden de registro, por ejemplo colocando primero el contacto y luego el nombre de la empresa, el dato de contacto sería tomado como el nombre de la empresa y el dato del nombre de la empresa como contacto.
Campos y registros
La estructura de almacenamiento de datos, la podemos definir en campos y registros. Un campo sería un tipo de dato y un registro sería el conjunto de campos que definen un elemento. Siguiendo con el ejemplo del archivo de proveedores, los campos de nuestra estructura serían: nombre del proveedor, contacto en el proveedor y teléfono. Y un registro sería el conjunto de campos que definen un elemento, en nuestro caso, un proveedor.
Pues bien, nuestro amigo Antonio, para evitar errores con los datos, decide realizar algunas mejoras en sus archivos secuenciales. Básicamente, introduce una marca de sincronismo, que nos indica el final de un registro. Esta marca puede ser cualquiera que definamos, pero una comúnmente empleada era <FIN>.
Con esta mejora, el archivo de proveedores quedaría:
Frutas Gutierrez
Antonio Gutierrez
607454545
<FIN>
Hortalizas del Sur
Guillermo Morales
652854874
<FIN>
Azucarera Sevillana
Rodrigo Mendez
622525885
<FIN>
Lógicamente, esta marca no podía ser nunca el valor de un campo, ya que nos conduciría a error, interpretaríamos dicho campo como el final del registro.
Soporte físico
En aquellos tiempos, Antonio emplearía cintas magnéticas para almacenar sus datos. Una cinta que se enrollaba sobre un rodillo, y que contenía partículas magnéticas para almacenar los datos. La cinta se iba desenrollando y se hacia pasar por un cabezal para su lectura o escritura, el mismo sistema empleado para las famosas cassettes de música. El propio funcionamiento de este sistema forzaba a que el acceso fuera secuencial, recorriendo la cinta de principio a fin.

Ejemplo de fichero secuencial (con Visual Basic)
Para entender como funcionaban los archivos de acceso secuencial, lo mejor es experimentarlo en nuestras carnes. Y para ello, vamos a crear un fichero secuencial, a leer y escribir datos en él.
Por simplicidad, para no tener que instalar ningún IDE de ningún lenguaje de programación, en las clases de Arquitectura de Datos, utilizamos VBA (Visual Basic Application) al que ya tenemos acceso en los ordenadores del aula, a través de Access del paquete de Microsoft Office Professional.
El ejercicio contempla 7 pasos:
Paso 1: Creamos una base de datos
Creamos una base de datos nueva, le ponemos el nombre que queramos, por ejemplo: BBDD
Paso 2: Creamos un modulo nuevo
Vamos a la pestaña “HERRAMIENTAS DE BASE DE DATOS” , pulsamos en “Visual Basic”.
A continuación, en el menú Inserta/Modulo, creamos un nuevo módulo. En mi caso, lo dejo con el nombre por defecto: “Módulo1”, ya que sólo lo vamos a usar para practicar.
Paso 3: Programamos un procedimiento para registro de datos
Lo primero que haremos será crear un archivo con los datos. Por ejemplo, con los datos de proveedores que manejaba Antonio. El procedimiento que realizaría esta tarea sería:
Sub RegistroEnArchivoSecuencial()
On Error GoTo e
ChDrive ("D")
ChDir "D:\pruebas"
Open "Proveedores.txt" For Output As #1
'Registro de proveedores
Print #1, "Frutas Gutierrez"
Print #1, "Antonio Gutierrez"
Print #1, "607454545"
Print #1, "<FIN>"
Print #1, "Hortalizas del Sur"
Print #1, "Guillermo Morales"
Print #1, "652854874"
Print #1, "<FIN>"
Print #1, "Azucarera Sevillana"
Print #1, "Rodrigo Mendez"
Print #1, "622525885"
Print #1, "<FIN>"
'Cerrar el archivo:
Close #1
MsgBox ("Guardados 3 registros de proveedores")
Exit Sub
e:
MsgBox (Err.Description)
End Sub
Sin explicar en profundidad como funciona el procedimiento, ya que este no es un curso de programación, sencillamente comentar que el procedimiento crea un fichero en la ruta especificada y luego vamos escribiendo los datos en él, de manera secuencial.
Vemos que tenemos que seguir un orden para los campos y acabar cada registro con la marca de sincronismo “<FIN>”.
Paso 4: Ejecutamos el procedimiento
Desde la ventana de Inmediato, ejecutamos el procedimiento.
Observamos el resulto, en la ruta indicada se ha generado el fichero Proveedores.txt. Si abrimos el fichero veremos como se han cargado los datos de forma secuencial.

Paso 5: Programamos un procedimiento para la lectura de los datos
En mi caso lo llamo leyendo y tendría el siguiente aspecto:
Sub Leyendo()
On Error GoTo e
ChDrive ("D")
ChDir "D:\pruebas"
Dim linea As String
Dim MyChar As String
Dim PintarLinea As Boolean
'Instrucción Open: https://docs.microsoft.com/es-es/office/vba/language/reference/user-interface-help/open-statement
Open "Proveedores.txt" For Input As #1
'Variable cadena donde guardo la linea que leo
linea = ""
'Variable booleana para saber si hay que pintar o no la linea.
'La linea se va construyendo caracter a caracter.
'Hago PintarLinea verdadero cuando llego a un final de linea
PintarLinea = False
' Bucle hasta llegar al final del fichero
Do While Not EOF(1)
MyChar = Input(1, #1)
If MyChar = Chr(13) Then
PintarLinea = True
ElseIf (MyChar <> Chr(10)) Then
linea = linea + MyChar
Else
End If
If PintarLinea Then
Debug.Print linea
linea = ""
PintarLinea = False
End If
Loop
Close #1
Exit Sub
e:
MsgBox (Err.Description)
End Sub
Si ejecutamos el procedimiento en la pantalla de Inmediato, veremos que se nos imprimen en pantalla todos los datos del fichero. Los hemos ido leyendo carácter a carácter de forma secuencial, y dibujando en pantalla cada línea del fichero.
Paso 6: Programamos un procedimiento para buscar un registro, para recuperar los datos de un proveedor
Llamo al procedimiento BuscandoProveedor, y su código sería:
Sub BuscandoProveedor()
ChDrive ("D")
ChDir "D:\pruebas"
Dim linea, MyChar, proveedor As String
Dim PintarLinea, encontrado As Boolean
Dim numCamposPintados As Integer
'guardo en la variable proveedor el nombre del proveedor
'que introduce el usuario
proveedor = InputBox("Introduce el nombre del proveedor que quieres buscar", "Busqueda")
Open "Proveedores.txt" For Input As #1
linea = ""
PintarLinea = False
encontrado = False
numCamposPintados = 0
'Recorro todo el fichero hasta la marca final de fichero EOF
Do While Not EOF(1)
MyChar = Input(1, #1)
If MyChar = Chr(13) Then
PintarLinea = True
ElseIf (MyChar <> Chr(10)) Then
linea = linea + MyChar
Else
End If
'Comprobación para ver si he encontrado al proveedor
If linea = proveedor Then
encontrado = True
End If
'Si tengo una linea completa para pintar, PintarLinea es true
'Si he encontrado el proveedor, encontrado es true
'Una vez encontrado, pinto la linea leida y las dos siguientes.
'El registro tiene tres campos, tres lineas.
If PintarLinea Then
If encontrado Then
Debug.Print linea
numCamposPintados = numCamposPintados + 1
End If
If numCamposPintados = 3 Then
encontrado = False
End If
linea = ""
PintarLinea = False
End If
Loop
Close #1
'Si no encontramos el proveedor que buscaba el usuario,
'lo indico con un mensaje
If numCamposPintados = 0 Then
MsgBox "Proveedor no encontrado"
End If
End Sub
Si lo ejecutamos, veremos que nos aparece un cuadro de dialogo para que introduzcamos el nombre del proveedor que vamos a buscar.
El funcionamiento es similar al anterior procedimiento en el que leíamos las líneas del fichero, sólo que en este caso voy comparando las líneas leídas con el nombre del proveedor introducido por el usuario, y en el caso de que coincidan, escribo en pantalla esa línea y las dos siguientes, ya que el registro completo del proveedor tiene tres campos.
Si por ejemplo buscamos el proveedor: Azucarera Sevillana, el resultado sería:

Paso 7: Forzando un error
Como ya he comentado, la estructura de los ficheros secuenciales es muy estricta, muy fija. En este ejemplo, si nos equivocáramos e introdujéramos “Rodrigo Mendez” como proveedor, en lugar de “Azucarera Sevillana”, obtendríamos los campos siguientes, típico del acceso secuencial, no estaríamos obteniendo el registro completo:

Tras completar los 7 pasos de este ejercicio, estoy seguro de que te has hecho una idea del funcionamiento de los archivos de acceso secuencial, pero esto fue la primera solución para digitalización de datos, cuyas limitaciones fueron superadas por los archivos de acceso aleatorio, pero esto será tema para otro post.
NOTA:
Este post es parte de la colección “Sistemas de acceso y almacenamiento de datos”. Puedes ver el índice de esta colección aquí.