Todos los procesos arriba descritos son absolutamente necesaraios menos uno, el numero 3, claro que para que quieres hacer todos los demas si no vas a usarlos, pero bueno, el 3 es el unico que puede omitirse.
Ademas de que todos son necesarios, tambien es necesario que estan en ese orden, incluso el 3, con uno solo que cambies de lugar te provocara un error, lo malo de esto es que es un error en tiempo de ejecucion, asi que te daras cuenta cuando el programa termine inesperadamente
Ahora te voy a explicar como hacer y que hace cada uno y comprenderas porque es necesario que esten en ese orden.
Si te has fijado, con la declaracion de una variable de tipo archivo archivo : file of integer no se especifica cual va a ser el nombre del archivo en el disco duro (es el que me gusta llamar archivo fisico, la variable es lo que me gusta llamar archivo logico), la asignacion por lo tanto es la relacion que hay entre el archivo logico y el archivo fisico, el archivo logico sirve para especificar todas las acciones que se realizaran sobre el archivo fisico, y el archivo fisico es en el que se reflejaran todas esas acciones.
La asignacion se hace con el procedimento assign el cual asigna el nombre de un archivo externo a una variable de tipo archivo y tiene la siguiente sintaxis
assign ( archivo_logico , ' archivo.ext ' );Observese las comillas simples en archivo fisico el primer parametro es la variable de tipo archivo como ya habiamos quedado de acuerdo (el archivo logico), el segundo parametro es la ruta y el nombre que tendra el archivo en el disco duro, es un string, esto es altamente aprovechable porque incluso puedes pedir el nombre del archivo al usuario, si no se especifica una ruta, el archivo se creara en el directorio donde se ejecute el programa.
Una variable de tipo archivo puede usarse para acceder a diferentes archivos fisicos, es decir que a una misma variable puedes asignarle el control de varios archivos fisicos (todos del mismo tipo, obvio), pero no al mismo tiempo. Y muchas variables de tipo archivo pueden usarse para acceder al mismo archivo fisico al mismo tiempo, pero no es nada recomendable, esto es controlado por el programador, asi que no lo hagan.
type
tarchivo:file of empleado;
var
     archivo:tarchivo;
begin
     assign(archivo,'empleados.dat');
end.
La variable archivo es de tipo tarchivo y tarchivo es de tipo file of empleado por lo tanto archivo : tarchivo = archivo: file of empleado
Con lo anterior, asignamos a la variable archivo el control sobre el archivo fisico que se llama empleados.dat, la extension es lo de menos, puedes incluso crear archivos sin extension, pero por convencion general los archivos de datos son de extension .dat observa la siguiente version del programa anterior.
type
tarchivo:file of empleado;
var
     archivo:tarchivo;
     nomFile:String
begin
     Write('Que nombre desea darle al archivo: ');
     Readln(nomFile);
     assign(archivo,'C:\' + nomFile + '.dat');
end.
Puedes incluso pedir el nombre de la extension. Acuerdense que si no se especifica una ruta para el archivo fisco (podria ser "C:\Windows\" etc.etc.) el archivo se creara en el mismo directorio donde se ejecute el programa, en lo personal, casi nunca especifico una ruta para el archivo (dejo que se cree donde ejecuto el programa).
Una vez que asignamos el archivo fisico a el archivo logico podemos crear o abrir un archivo, piensalo bien y es logico, como abrir o crear un archivo sin especificar cual es el nombre del archivo, entonces �cual archivo se abre o cual se crea?
Porque estan juntos abrir o crear, estan juntos pero no revueltos, puedes abrir o puedes crear aunque cuando los creas quedan abiertos para su uso.
Los archivos (que estas seguro que existen) se abren con el procedimiento RESET y su sintaxis es la siguiente
reset ( archivo_logico );El unico parametro es la variable de tipo archivo que tiene asignada el nombre (y la ruta) del archivo que se quiere abrir y listo, si el archivo existe lo abre, y si no... y si no pues tendremos un flamante error #2 en tiempo de ejecucion File not found (archivo no encontrado)
Los archivos que no existan se pueden crear, para crear un archivo se usa el procedimiento REWRITE, y tiene la siguiente sintaxis.
rewrite ( archivo_logico );Aqui tambien, el unico parametro que se manda es la variable de tipo archivo que tiene asignada el nombre (y la ruta) del archivo que se quiere crear (este puede o no puede existir) si el archivo no existe se crea, y si existe..., no aqui no tendremos ningun error (por lo menos ningun error en tiempo de compilacion) pero atencion si el archivo existe, rewrite borra todo el contenido que pudiera haber en el. Se pierde toda la informacion
type
tarchivo:file of empleado;
var
     archivo:tarchivo;
begin
     assign(archivo,'empleados.dat');
     reset(archivo);
end.
Horror, la primera vez que se corra este programa marcara un error en tiempo de ejecucion, pues el archivo no se ha creado aun. Solucion, usar rewrite en vez de reset
type
tarchivo:file of empleado;
var
     archivo:tarchivo;
begin
     assign(archivo,'empleados.dat');
     rewrite(archivo);
end.
Doble Horror, bueno, por lo menos el programa corre la primera vez, y corre la segunda y corre todas las veces que lo mandes a correr, pero cada vez que lo corres creas el archivo, es decir cualquier cosa que hayas guardado en el se pierde cada vez que lo corras (mejor usa arreglos). Solucion, nunca salgas del programa... La unica solucion posible es verificar que el archivo exista, si el archivo existe se abre y si no existe se crea.
Para verificar si el archivo existe vamos a usar una directiva del compilador que es la siguiente {$I} tal y como esta escrita, esta directiva cuando esta activa (por defecto) verifica los errores de entrada y salida (querer abrir un archivo que no exista es un error de entrada y salida)
Entonces lo que hacemos es, desactivar el chequeo de error {$I-} intentar abrir el archivo, si hay algun error, lo mas seguro es que no se pudo abrir porque no se encontro, entonces se crea, y al final se vuelve a activar el chequeo de errores {$I+}.
Para saber si hubo un error se comprueba el valor de la function IORESULT que devuelve un entero que representa el estado de la ultima operacion de entrada y salida, en este caso seria del reset, si dicho valor es diferente de 0 significa que hubo un error
type
tarchivo:file of empleado;
var
     archivo:tarchivo;
begin
     assign(archivo,'empleados.dat');
     {$I-}
     reset(archivo);
     {$I+}
     If ioresult < > 0 then
         rewrite(archivo);
end.
Esta es una buena solucion, asi, la primera vez que se corra el programa habra un error en el reset, pero el programa no terminara porque hemos desactivado el chequeo de errores de entrada y salida, entonces comprobamos el estado de la ultima operacion el reset, como no encontro el archivo ioresult devolvera un numero diferente de 0 entonces usamos el rewrite y el archivo se crea y queda abierto. La segunda vez no habra ningun error en el reset por lo tanto el archivo queda abierto y los datos se mantienen.
Esto puede convertirse en un procedimiento y entonces el programa principal queda mucho mas legible.
type
tarchivo:file of empleado;
var
     archivo:tarchivo;
procedure crearArchivo(nombre:String);
begin
     assign(archivo,nombre);
     {$I-}
     reset(archivo);
     {$I+}
     If ioresult <> 0 then
         rewrite(archivo);
end;
begin
     crearArchivo('empleados.dat');
end.
Ahora bien, dije por ahi intentar abrir el archivo, si hay algun error, lo mas seguro es que no se pudo abrir porque no se encontro, lo mas seguro, o sea que pudo ser algun otro tipo de error, que tal que se quiera abrir un disco de A: y no se haya insertado un disco, ese es un error de entrada y salida, pero es un error diferente del que se marcaria si no se encuentra un archivo, bueno aqui mismo nos sirve la funcion IORESULT y que el entero que devuelve es el numero de error, pueden encontrar una descripcion detalla de los errores en tiempo de ejecucion en la ayuda de Turbo Pascal
Como ya sabemos que el numero de error cuando no se encuentra un archivo es el numero 2 entonces podemos personalizar el procedimiento crearArchivo
type
tarchivo:file of empleado;
var
     archivo:tarchivo;
procedure crearArchivo(nombre:String);
begin
     assign(archivo,nombre);
     {$I-}
     reset(archivo);
     {$I+}
     If ioresult =2 then
         rewrite(archivo)
     else begin
         write('Error desconocido');
         write('El programa terminara');
         readkey;
         halt
     end.
end;
begin
     crearArchivo('empleados.dat');
end.
Por ejemplo el numero de error cuando un drive no este listo puede ser el A:, B: etc. etc. es el #152, podemos poner un case para describir todos los posibles errores que se presenten, o mejor aun, podemos crear una unidad que maneje todos los errores de pascal y llamarla cuando sea necesaria, piensenlo, las posibilidades son infinitas.
EL ultimo paso es cerrar el archivo y eso se hace con la palabra reservada CLOSE que tiene la siguiente sintaxis
close ( archivo_logico );Muy simple, pero muy importante recordarlo, ya que no cerrar un archivo trae consecuencias muy graves, desde dejar el archivo inaccesible o perder informacion del mismo.
type
tarchivo:file of empleado;
var
     archivo:tarchivo;
procedure crearArchivo(nombre:String);
begin
     assign(archivo,'empleados.dat');
     {$I-}
     reset(archivo);
     {$I+}
     If ioresult =2 then
         rerwrite(archivo)
     else begin
         write('Error desconocido');
         write('El programa terminara');
         readkey;
         halt
     end.
end;
begin
     crearArchivo('empleados.dat');
     {Aqui van todas las instrucciones para usar el archivo}
     close(archivo);
end.
Muy interesante, no, bueno, hasta aqui ya sabesmo que son y para que sirve y podemos inicializar un archivo con exito.