prÁctica nº 14: ficheros...

4
DEPARTAMENT DINFORMÀTICA Informática PRÀCTICA 14 Curs 2002-2003 FACULTAT DE MATEMATI QUES UNIVERSITAT DE VALENCIA Práctica 14: Ficheros (archivos). 1/4 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: ifstream entrada; //entrada identifica a un fichero de lectura. ofstream salida; //salida identifica a un fichero de escritura. 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());

Upload: others

Post on 08-Aug-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PRÁCTICA Nº 14: Ficheros (archivos).informatica.uv.es/.../INF/2002_03/laboratori/prac14.pdfPráctica 14: Ficheros (archivos). 4/4 llame “producto.txt”. • Escribe una función

DEPARTAMENT D’INFORMÀTICA

Informática PRÀCTICA 14 Curs 2002-2003

FACULTAT DE MATEMATI QUES UNIVERSITAT DE VALENCIA

Práctica 14: Ficheros (archivos). 1/4

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: ifstream entrada; //entrada identifica a un fichero de lectura. ofstream salida; //salida identifica a un fichero de escritura.

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 abrir lo 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());

Page 2: PRÁCTICA Nº 14: Ficheros (archivos).informatica.uv.es/.../INF/2002_03/laboratori/prac14.pdfPráctica 14: Ficheros (archivos). 4/4 llame “producto.txt”. • Escribe una función

DEPARTAMENT D’INFORMÀTICA

Informática PRÀCTICA 14 Curs 2002-2003

FACULTAT DE MATEMATI QUES UNIVERSITAT DE VALENCIA

Práctica 14: Ficheros (archivos). 2/4

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; entrada >> x; //Funciona con tipos de datos que permitan la conversión a // cadena de caracteres. 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; salida << x; //Funciona con tipos de datos que permitan la conversión a // cadena de caracteres. 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.

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.

Page 3: PRÁCTICA Nº 14: Ficheros (archivos).informatica.uv.es/.../INF/2002_03/laboratori/prac14.pdfPráctica 14: Ficheros (archivos). 4/4 llame “producto.txt”. • Escribe una función

DEPARTAMENT D’INFORMÀTICA

Informática PRÀCTICA 14 Curs 2002-2003

FACULTAT DE MATEMATI QUES UNIVERSITAT DE VALENCIA

Práctica 14: Ficheros (archivos). 3/4

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); }

Ejercicios:

* [mostrarinfo.cpp] Realizar un programa en C++ que pida el nombre de un fichero ya escrito y lo muestre por pantalla.

* [contarvocales.cpp] Añade una función al ejercicio anterior de manera que cuente el número de apariciones de cada una de las letras que existen en el fichero y guarde los valores en un fichero de texto con el formato siguiente: a -> 12 veces b -> 4 veces

[estadistica.cpp] Escribe un programa que calcule la media de las longitudes de palabras que aparecen en un fichero de texto. Considera que una palabra esta siempre separada por un espacio en blanco.

[matrices.cpp] Escribe un programa en C que multiplique, sume o reste dos matrices, creando una función para cada operación. Cada matriz está almacenada en un fichero diferente de texto, un elemento por fila. El resultado lo guardarás en otro fichero texto con el mismo formato. La operación que se realizará entre las matrices se podrá seleccionar desde teclado.

* [productos.cpp] Escribir un programa que incorpore las siguientes funciones: • Escribe una función que pida como entrada parejas de números

enteros no superiores al valor 1000 por teclado y los escriba en un fichero de texto llamado “datos.txt” (no incluyas saltos de líneas para separar las parejas de valores).

• Escribe una función que lea del fichero “datos.txt” pareja por pareja, calcule su producto y lo escriba en un fichero que se

Page 4: PRÁCTICA Nº 14: Ficheros (archivos).informatica.uv.es/.../INF/2002_03/laboratori/prac14.pdfPráctica 14: Ficheros (archivos). 4/4 llame “producto.txt”. • Escribe una función

DEPARTAMENT D’INFORMÀTICA

Informática PRÀCTICA 14 Curs 2002-2003

FACULTAT DE MATEMATI QUES UNIVERSITAT DE VALENCIA

Práctica 14: Ficheros (archivos). 4/4

llame “producto.txt”. • Escribe una función que lea de “datos.txt” las parejas de

números y de “producto.txt” el resultado del producto y los escriba en otro fichero llamado “todo.txt” con el siguiente formato: NUMERO NUMERO RESULTADO 234 564 131976 50 120 6000

edita este último fichero con un editor de texto para ver el resultado. * [calificaciones.cpp] Escribe un programa que, dado un fichero binario que contiene los datos

personales de alumnos y sus calificaciones en una determinada asignatura, lea estos datos del fichero y traduzca las calificaciones dadas con valores numéricos a lo siguiente: SUSPENSO (x<5),

APROBADO (5≤x<7),

NOTABLE (7≤x<8,5),

SOBRESALIENTE (x≥8,5)

El resultado se almacenará en otro fichero binario. [clientes.cpp] Para guardar la información de los clientes de un banco, usamos una

lista enlazada. De cada cliente tenemos la siguiente información: número de cuenta, la población y el saldo. Escribe una función que a partir de la lista de clientes escriba en un fichero el saldo medio de los clientes de ‘Valencia’ (según el campo población), otra que escriba en otro fichero el saldo de todos los clientes de Valencia. La información de los clientes se encuentra guardada en un fichero de texto. Escribe también las funciones para leer la información de los clientes del fichero de texto y ponerla en la lista enlazada.

[reemplazar.cpp] Escribe una función que simule la función “reemplazar” que disponen los editores de texto. A dicha función le pasamos el nombre del fichero donde se encuentra el texto, la cadena que queremos buscar, y la cadena que utilizamos para reemplazar. La función nos tiene que devolver además el número total de reemplazos realizados en dicho texto.

* [fusion.cpp] Supongamos dos ficheros productos1.dat y productos2.dat, que contienen listas ordenadas de productos, ordenadas por el número de referencia del producto. La información de los productos es: Número de referencia, nombre del producto y cantidad de producto almacenado. Realizar una función que nos dé como resultado un tercer fichero total.dat, que contenga una única lista de productos también ordenada por el número de referencia del producto. Define un tipo de registro para guardar la información necesaria de los registros.