[ ] Informática PRÀCTICA 6 Curs 2002-2003 Departament d’Informàtica Departamento de Informática FACULTAT DE MATEMATIQUES UNIVERSITAT DE VALENCIA Práctica Nº 14: Ficheros (archivos) Objetivos de la práctica: - Mostrar la manera de utilizar los archivos para almacenar la información. - Enseñar al alumno la necesidad de seguir unos pasos fijos cuando se trabaja con ficheros (apertura, procesamiento, cierre). - Enseñar la necesidad de realizar comprobaciones de que el fichero se ha abierto correctamente cuando se trabaja con ficheros. 1.1. Ficheros en C++ Incluir previamente la biblioteca “fstream” donde están definidos los tipos de ficheros en C++ y las operaciones que se pueden realizar sobre ellos: #include <fstream.h> Existen dos tipos de ficheros: de entrada (sólo está permitido leer) y de salida (sólo está permitido escribir datos). Los dos tipos de archivos están identificados en C++ por dos clases diferentes: ifstream (Input Stream) Archivos de entrada (lectura). ofstream (Output Stream) Archivos de salida (escritura). Declaración de variables: //entrada identifica a un fichero de lectura. ofstream salida; //salida identifica a un fichero de escritura. ifstream entrada; 1.2. Apertura de un fichero Una vez definida la variable que usaremos para referirnos al fichero con el que vamos a trabajar, y antes de realizar ninguna otra operación sobre el fichero, lo primero que hay que hacer es abrirlo mediante open: entrada.open(“fentrada.dat”); Abre el fichero cuyo nombre en disco es fentrada.dat y lo asocia a la variable entrada. El fichero que se abre es un fichero de lectura. salida.open(“fsalida.dat”); Abre el fichero cuyo nombre en disco es fsalida.dat y lo asocia a la variable salida. El fichero que se abre es un fichero de escritura. Todos los archivos de entrada y salida que nuestros programas usan tienen dos nombres: el verdadero nombre del archivo (nombre físico) que solo se usa en la llamada a la función open, que conecta el archivo a un flujo, y el nombre del flujo (nombre lógico) al que queda conectado el archivo y es el que usaremos en las operaciones de lectura/escritura sobre archivos. Nombre de archivos como entradas Podemos abrir un archivo cuyo nombre está guardado en una variable tipo string. Esta técnica es muy útil para introducir los nombres de los archivos por teclado. string nombre; cin >> nombre; entrada.open(nombre.c_str()); Práctica Nº 14: Ficheros (archivos) 1/3 [ ] Departament d’Informàtica Departamento de Informática Informática PRÀCTICA 6 Curs 2002-2003 FACULTAT DE MATEMATIQUES UNIVERSITAT DE VALENCIA Comprobar si un archivo se abrió correctamente Una llamada a una función open puede fallar por varias razones: si intentamos abrir un fichero de entrada y no existe dicho fichero, intentamos abrir un fichero de salida y no tenemos permisos de escritura sobre dicho fichero. En estos casos es posible que no se despliegue un mensaje de error y que el programa continúe y haga algo inesperado. Por ello, es conveniente después de una llamada a open comprobar si el fichero no se ha abierto correctamente y si es así terminar la ejecución del programa: entrada.open(“datos.dat”); if (!entrada) { cout << “No se pudo abrir el fichero de entrada\n”; exit(1); } La instrucción exit(1) termina el programa de inmediato. Esta instrucción está definida en la biblioteca stdlib, por tanto, necesitamos incluir #include <stdlib.h>. 1.3. Operaciones sobre archivos: lectura/escritura Leer información de un archivo (lectura): >>, get, getline. int x; /* * Funciona con tipos de datos que permitan la conversión a * cadena de caracteres. */ entrada >> x; entrada.get(c); //Sólo funciona con char string frase; getline (entrada,frase); // Sólo funciona con string Escribir información en un archivo (escritura): <<, put int x; /* *Funciona con tipos de datos que permitan la conversión a cadena de * caracteres. */ salida << x; salida.put(c); //Sólo funciona con char En las operaciones de escritura en archivos podemos usar los mismos modificadores de formato que utilizamos en la práctica 3 para mostrar información por pantalla, la única diferencia es que ahora las funciones de formato las aplicamos sobre el fichero de salida en el que queremos escribir: salida. Práctica Nº 14: Ficheros (archivos) 2/3 [ ] Departament d’Informàtica Departamento de Informática Informática PRÀCTICA 6 Curs 2002-2003 FACULTAT DE MATEMATIQUES UNIVERSITAT DE VALENCIA salida.setf(ios::fixed); // Escribiremos los números en el fichero salida // en notación punto fijo. salida.setf(ios::showpoint); //Escribiremos siempre con un punto los // números reales en el fichero salida salida.precision(2); //Escribir los números reales con 2 decimales en el //fichero salida. 1.4. Cerrar ficheros Todos los archivos deben cerrarse cuando el programa haya terminado de obtener entradas del archivo o de enviar salidas al archivo. Al cerrar un archivo desconectamos su flujo. Los archivos se cierran con la instrucción close. Observar que la función close no toma argumentos. entrada.close( ); salida.close( ); 1.5. La función eof() Esta función se utiliza para detectar el final de fichero, “end of file”. entrada.eof( ); Esta función nos devuelve una expresión booleana: true si hemos llegado al final del fichero y ya no hay más información para leer, y false en caso contrario. En el siguiente bucle escribiremos por pantalla toda la información del fichero. while (! entrada.eof( )) { cout << siguiente; entrada.get(siguiente); } Práctica Nº 14: Ficheros (archivos) 3/3