Programación Instituto Tecnológico de Celaya ARCHIVOS (FICHEROS) Siempre que se usa una computadora, se utilizan archivos para almacenar la información. Por ejemplo, cuando se crea un programa en C++, se crea un archivo con extensión cpp que contiene el código del programa. También se pueden utilizar archivos para almacenar los resultados que se obtienen en un programa y para leer los datos que requiere un programa. Este documento explica el uso de archivos I/O en C++. Archivo I/O El término I/O (Input/Output) se refiere a la “entrada” de datos y la “salida” de resultados de un programa. Hasta ahora, se han manejado la sentencia cout para “salida” de resultados y la sentencia cin para “entrada” de datos a un programa. cout y cin envían los mensajes o leen la información a/desde la pantalla de la computadora. El mecanismo por el cual la información se lee y se envía a la computadora a través de la pantalla se dice que es salida/entrada estándar. Es posible, sin embargo, en lugar de enviar mensajes a pantalla enviarlos a un archivo. De la misma forma, en lugar de leer datos a través de la pantalla, es también posible leerlos desde un archivo. Ambas formas son válidas y útiles. La diferencia es que cuando se utiliza la salida a pantalla, la información se obtiene sólo en forma temporal, pues se pierde cuando termina de ejecutarse el programa y la ventana desaparece. Por otra parte, si los resultados se envían a un archivo, este archivo queda guardado en el disco aún después de que el programa termina de ejecutarse. Por ello se dice que los archivos son una forma de almacenar los datos en forma permanente. Los archivos que se guardan y se leen se dice que son de tipo texto, pues pueden contener únicamente caracteres en código ASCII (como letras, números, algunos símbolos, etc). Así, es posible editar archivos de este tipo con Ingeniería Química Programación Instituto Tecnológico de Celaya cualquier editor de texto (como Notepad, Wordpad, Word, etc.) siempre y cuando se guarden como archivos de texto. Cuando un programa envía información a un archivo, se dice que el archivo es de escritura. Cuando un programa lee información desde un archivo, se dice que el archivo es de lectura. TIPOS DE ARCHIVOS I/O Además de la clasificación en lo que respecta a si el archivo es de escritura o de lectura, los archivos I/O se clasifican en dos categorías: Archivos secuenciales o archivos de acceso aleatorio. Archivos Secuenciales En estos archivos, la información sólo puede leerse y escribirse empezando desde el principio del archivo. Los archivos secuenciales tienen algunas características que hay que tener en cuenta: 1. La escritura de nuevos datos siempre se hace al final del archivo. 2. Para leer un dato concreto del archivo hay que avanzar siempre hasta donde se encuentre dicho dato. Si el dato requerido se encuentra antes del dato en que está se está posicionado el archivo en un momento dado, será necesario regresar al comienzo del archivo y avanzar hasta el dato necesario. Archivos de Acceso Aleatorio Los archivos de acceso aleatorio son más versátiles, permiten acceder a cualquier parte del archivo en cualquier momento, como si fueran arreglos en memoria. Las operaciones de lectura y/o escritura pueden hacerse en cualquier punto del archivo. En realidad C++ no distingue si los archivos que usamos son secuenciales o de acceso aleatorio, es el tratamiento que hagamos de ellos lo que los clasifica como de uno u otro tipo. En el curso se considerará sólo el caso en el que el archivo se lee en orden desde el principio hasta el final (archivos secuenciales). Ingeniería Química Programación Instituto Tecnológico de Celaya DECLARACIÓN DE ARCHIVOS I/O Y APLICACIONES Si se recuerda, las instrucciones cin y cout se definen en la librería iostream.h, y es por ello que siempre incluimos esa librería en nuestro programa. En forma similar, cuando se desea usa archivos I/O, es necesario incluir la librería fstream.h, es decir, se debe incluir en el programa: #include <fstream.h> Asimismo, cin y cout pueden verse como dos comandos que ya han sido definidos y que “conectan” la información del programa con la pantalla del computador. Si se quiere que la información se “conecte” con un archivo es necesario declarar dos nuevos comandos que sirvan para ese propósito y que se puedan usar en lugar de cin y cout. Una declaración típica que se realiza es la siguiente: ifstream in_stream; ofstream out_stream; Esto puede interpretarse como una declaración de dos “comandos” (in_stream y out_stream) que pueden utilizarse en lugar de cin y cout. ifstream (“input-file- stream”) y ofstream(output-file-stream) se encuentran definidos en la librería fstream.h. Si se realiza la declaración anterior, entonces sería posible utilizar in_stream y out_stream exactamente como se han usado cin y cout. La diferencia es que la salida de resultados y la entrada de datos se harían a y desde un archivo, respectivamente. Por ejemplo: int numero; in_stream>>numero; /* Lee el valor de numero desde un archivo*/ out_stream<<”El numero es “>>numero>>”\n”;/*Escribe datos a un archivo*/ Ingeniería Química Programación Instituto Tecnológico de Celaya Ahora, en el ejemplo anterior se habla de que se escribe y se lee a y desde un archivo. ¿Desde/de cuál archivo? La respuesta a esa pregunta se debe de incluir en el programa a través de instrucciones como la siguiente: in_stream.open(“entrada.dat”); out_stream.open(“salida.dat”); Instrucciones como las anteriores se deben de incluir en el programa antes de usar in_stream y out_stream. Lo que las dos instrucciones anteriores no están indicando es que el programa utilizará un archivo denominado entrada.dat para leer datos y que va a escribir los resultados en un archivo llamado salida.dat. Se dice que las instrucciones anteriores están “abriendo” archivos para que éstos puedan ser usados para leer o escribir datos. Por último, una vez que el programa se ha ejecutado, es necesario “cerrar” los archivos que se “abrieron”. Para ello se utiliza: in_stream.close(); out_stream.close(); Resumen de Sentencias e Instrucciones para Usar Archivos I/O 1) Incluir la librería correspondiente: #include <fstream.h> 2) Seleccione los nombres para dos comandos que utilice en lugar de cin y cout para leer y escribir de/desde un archivo. Si por ejemplo selecciona a_ent (para entrada en lugar de cin) y a_sal (para salida en lugar de cout), deberá declararlos como: ifstream a_ent; ofstream a_sal; Ingeniería Química Programación Instituto Tecnológico de Celaya 3) Conecte los comandos al archivo en que quiera guardar los resultados o al archivo del cual quiera leer los datos. Suponga que se quieren guardar los datos en un archivo llamada salida.dat y se quieren leer los datos desde el archivo entrada.dat. Se deberá usar entonces: a_ent.open(“entrada.dat”); a_sal.open(“salida.dat”); 4) A partir de entonces, cada vez que use a_sal es como usar cout, pero la salida es al archivo, y cada vez que use a_ent es como usar cin, pero la lectura de datos es desde el archivo. Ejemplo: a_ent>>variable; a_sal<<variable2; 5) Cierre los archivos luego de utilizarlos: a_ent.close(); a_sal.close(); Ingeniería Química Programación Instituto Tecnológico de Celaya EJEMPLO #include <fstream.h> #include<iostream.h> #include<stdlib.h> int main() { /* Este programa pide 3 numero a un usuario y luego los escribe en el archivo salida.dat */ int x[3]; ofstream csalida; csalida.open(“salida.dat”); /* Observe que cin y cout se pueden seguir usando como antes */ cout<<”Dame el valor de 3 numeros enteros \n” <<”Presiona Enter despues de cada uno \n”; cin>>x[0]>>x[1]>>x[2]; /* Escribir los valores en el archivo */ csalida<<x[0]<<”\t”<<x[1]<<”\t”<<x[2]<<”\n”; /* Cierra el archivo */ csalida.close(); system(“PAUSE”); return 0; } Ingeniería Química