Está en la página 1de 30

Tema 3

Ficheros de
texto
Definicin
Declaracin
Apertura y cierre
Lectura
Tema 3: Ficheros en C++
Escritura
Ejercicios
Programacin 2
Ficheros
binarios
Definicin
Declaracin,
apertura y cierre
Lectura
Escritura
Ejercicios

Errores Curso 2013-2014


ndice

Tema 3
1 Ficheros de texto
Definicin
Ficheros de
texto
Declaracin
Definicin
Declaracin
Apertura y cierre
Apertura y cierre
Lectura
Lectura de un fichero de texto (1/2)
Escritura
Ejercicios
Escritura de un fichero de texto
Ficheros Ejercicios
binarios
Definicin
Declaracin,
2 Ficheros binarios
apertura y cierre
Lectura
Definicin
Escritura
Ejercicios
Declaracin, apertura y cierre
Errores Lectura de un fichero binario
Escritura de un fichero binario
Ejercicios
3 Control de errores de lectura/escritura
Qu es un fichero de texto?

Tema 3

Ficheros de Tambin se le denomina fichero con formato


texto
Definicin
Declaracin
Es un fichero que contiene solamente caracteres
Apertura y cierre
Lectura
imprimibles
Escritura
Ejercicios Qu es un carcter imprimible? Aquel cuyo cdigo
Ficheros ASCII es mayor o igual que 32.
binarios
Definicin
Declaracin,
Qu es el cdigo ASCII? Es un cdigo que asigna a
apertura y cierre
Lectura
cada carcter un nmero (los ordenadores solamente
Escritura
Ejercicios
almacenan nmeros).
Errores Ejemplos de ficheros de texto: un programa en C++,
una pgina web (HTML), un makefile, . . .
Declaracin de variables de tipo fichero

Tema 3

Ficheros de
texto
Definicin
Declaracin
Apertura y cierre
Lectura Hay que poner #include <fstream> :
Escritura
Ejercicios ifstream fich_leer; (slo para leer)
Ficheros ofstream fich_escribir; (slo para escribir)
binarios
Definicin
fstream fich_leer_y_escribir; (raro en
Declaracin,
apertura y cierre
ficheros de texto)
Lectura
Escritura
Ejercicios

Errores
Apertura y cierre (1/2)

Tema 3

Modos de apertura: lectura, escritura, lectura/escritura,


Ficheros de
texto aadir al final
Definicin
Declaracin En C++ se abren los ficheros con open, p.ej.:
Apertura y cierre
Lectura
Escritura const char nombre[]="mifichero.txt";
Ejercicios fichero.open(nombre,ios::in);
Ficheros
binarios
Definicin Si el nombre del fichero es un string debemos
Declaracin,
apertura y cierre convertirlo con la funcin c_str().
Lectura
Escritura
Ejercicios
Modos de apertura en C++:
lectura ios::in
Errores
escritura ios::out
lectura/escritura ios::in | ios::out (fstream)
aadir al final ios::out | ios::app
Apertura y cierre (2/2)

Tema 3

Forma abreviada:
Ficheros de ifstream fl("ifi.txt"); // por defecto, ios::in
texto
Definicin
Declaracin ofstream fe("ofi.txt"); // ios::out
Apertura y cierre
Lectura
Escritura
Ejercicios

Ficheros Cmo comprobar si se ha abierto el fichero? Cmo


binarios
Definicin
cerrarlo?
Declaracin,
apertura y cierre
Lectura
if (fichero.is_open())
Escritura {
Ejercicios
// ya se puede leer ...
Errores
fichero.close(); // cerrar el fichero
}
else // error de apertura
Deteccin del fin de fichero

Tema 3

Se utiliza el mtodo eof:


Ficheros de
texto ifstream fi;
Definicin ...
Declaracin
Apertura y cierre
while (!fi.eof() ...)
Lectura
Escritura
Ejercicios
Cmo funciona?
Ficheros
binarios
Cuando se intenta leer un dato (carcter, nmero, etc)
Definicin
Declaracin,
que ya no est en el fichero el mtodo devuelve true
apertura y cierre
Lectura OJO: despus de haber leido el ltimo dato vlido
Escritura
Ejercicios sigue devolviendo false, luego ...
Errores
Es necesario hacer una lectura extra (que puede
devolver datos no vlidos que deben ignorarse) para
provocar la deteccin del final del fichero
Lectura por lneas (1/2)

Tema 3

Ficheros de ...
texto
Definicin
if (fi.is_open())
Declaracin {
Apertura y cierre
getline(fi,s); // s es de tipo string
Lectura
Escritura // fi.getline(cad,tCAD); // cad es char []
Ejercicios while (!fi.eof())
Ficheros {
binarios // hacer algo con s
Definicin
Declaracin,
apertura y cierre getline(fi,s);
Lectura
Escritura
}
Ejercicios

Errores
fi.close();
}
Lectura por lneas (2/2)

Tema 3

Y si la ltima lnea del fichero no tiene \n? se pierde y


no se procesa!!
Ficheros de
texto
Definicin
...
Declaracin if (fi.is_open())
Apertura y cierre
{
Lectura
Escritura s="";
Ejercicios getline(fi,s);
Ficheros while (!fi.eof() || s.length()!=0)
binarios {
Definicin
Declaracin,
// hacer algo con s
apertura y cierre
Lectura
Escritura
s=""; // inicializar s
Ejercicios getline(fi,s);
Errores
}

fi.close();
}
Lectura carcter a carcter

Tema 3

Ficheros de
texto ...
Definicin if (fi.is_open())
Declaracin
Apertura y cierre
{
Lectura c = fi.get();
Escritura
while (!fi.eof())
Ejercicios
{
Ficheros // hacer algo con c
binarios
Definicin
Declaracin, c = fi.get();
apertura y cierre
Lectura
}
Escritura
Ejercicios
fi.close();
Errores }
Lectura de ms de una variable

Tema 3

Los ficheros son stream, funcionan como cin y cout


Ficheros de #include <fstream>
texto ...
Definicin
Declaracin
ifstream fi;
Apertura y cierre int numentero; double numreal;
Lectura
Escritura
Ejercicios
fi.open("mifichero.txt",ios::in);
if (fi.is_open())
Ficheros
binarios {
Definicin fi >> numentero;
Declaracin,
apertura y cierre
while (!fi.eof())
Lectura {
Escritura
Ejercicios
fi >> numreal;
// hacer algo con numentero y numreal
Errores
fi >> numentero; // lectura "extra" ?
}
fi.close();
}
Escritura de un fichero de texto

Tema 3

Ficheros de
texto
Definicin
Declaracin
ofstream fo;
Apertura y cierre
Lectura fo.open("mifichero.txt",ios::out);
Escritura
Ejercicios
if (fo.is_open())
{
Ficheros
binarios fo << "Un numero entero: " << numentero << endl;
Definicin ...
Declaracin,
apertura y cierre
Lectura fo.close();
Escritura
}
Ejercicios

Errores
Ejercicios (1/5)

Tema 3

Ficheros de
texto Ejercicio 1
Definicin
Declaracin
Apertura y cierre
Haz un programa que lea un fichero fichero.txt y
Lectura
Escritura
escriba en otro fichero FICHERO2.TXT el contenido del
Ejercicios fichero de entrada con todas las letras en maysculas.
Ficheros
binarios
Definicin
Ejemplo:
Declaracin,
apertura y cierre
Lectura
fichero.txt FICHERO2.TXT
Escritura Hola, mundo. HOLA, MUNDO.
Ejercicios
Como estamos? COMO ESTAMOS?
Errores
Adios, adios... ADIOS, ADIOS...
Ejercicios (2/5)

Tema 3

Ejercicio 2
Ficheros de Haz un programa que lea dos ficheros de texto, f1.txt y
texto
Definicin
f2.txt, y escriba por pantalla las lneas que sean
Declaracin
Apertura y cierre
distintas en cada fichero, con < delante si la lnea
Lectura
Escritura
corresponde a f1.txt, y > si corresponde a f2.txt.
Ejercicios

Ficheros Ejemplo:
binarios
Definicin
f1.txt f2.txt
Declaracin,
apertura y cierre hola, mundo. hola, mundo.
Lectura
Escritura
como estamos? como vamos?
Ejercicios adios, adios... adios, adios...
Errores
La salida debe ser:
< como estamos?
> como vamos?
Ejercicios (3/5)

Tema 3

Ejercicio 3
Ficheros de
texto
Definicin
Disea una funcin finfichero que reciba dos
Declaracin
Apertura y cierre
parmetros: el primero debe ser un nmero entero positivo
Lectura
Escritura
n, y el segundo el nombre de un fichero de texto. La funcin
Ejercicios
debe mostrar por pantalla las n ltimas lneas del fichero.
Ficheros
binarios Ejemplo:
Definicin
Declaracin,
apertura y cierre $ finfichero(3,"cadenas.txt")
Lectura
Escritura
Ejercicios with several words
Errores unapalabra
muuuuchas palabras, muchas, muchas...
Ejercicios (4/5)

Tema 3

Ficheros de Ejercicio 3 (sigue)


texto
Definicin
Declaracin
Hay dos soluciones:
Apertura y cierre
Lectura
1 A lo bestia: leer el fichero para contar las lneas que
Escritura
Ejercicios
tiene, y volver a leer el fichero para escribir las n lneas
Ficheros finales
binarios
Definicin PROBLEMA: y si el fichero tiene 100000000000000
Declaracin,
apertura y cierre lneas?
Lectura
Escritura
Ejercicios
2 Utilizar un vector de string de tamao n que
Errores almacene en todo momento las n ltimas lneas ledas
(aunque al principio tendr menos de n lneas)
Ejercicios (5/5)

Tema 3

Ejercicio 4
Ficheros de Dados dos ficheros de texto f1.txt y f2.txt, en los
texto
Definicin que cada lnea es una serie de nmeros separados por :,
Declaracin
Apertura y cierre y suponiendo que las lneas estn ordenadas por el primer
Lectura
Escritura nmero de menor a mayor en los dos ficheros, haz un
Ejercicios
programa que lea los dos ficheros lnea por lnea y escriba
Ficheros
binarios en el fichero f3.txt las lneas comunes a ambos
Definicin
Declaracin,
apertura y cierre
ficheros, como en el siguiente ejemplo:
Lectura
Escritura Ejemplo:
Ejercicios
f1.txt f2.txt f3.txt
Errores
10:4543:23 10:334:110 10:4543:23:334:110
15:1:234:67 12:222:222 15:1:234:67:881:44
17:188:22 15:881:44 20:111:22:454:313
20:111:22 20:454:313
Qu es un fichero binario?

Tema 3
Tambin se le denomina fichero sin formato
Ficheros de
Un fichero binario es un fichero en el que los datos se
texto
Definicin
almacenan tal y como se almacenan en la memoria del
Declaracin
Apertura y cierre
ordenador, no se convierten en caracteres para
Lectura almacenarlos.
Escritura
Ejercicios
Normalmente, cada elemento del que se quiere
Ficheros
binarios guardar informacin se almacena en un registro
Definicin
Declaracin, (struct)
apertura y cierre
Lectura
Escritura
Si los elementos se almacenan con registros, se puede
Ejercicios
acceder directamente al n-simo elemento sin leer los
Errores
n 1 anteriores.
Los ficheros de texto son ficheros de acceso
secuencial, y los binarios son ficheros de acceso
directo (o acceso aleatorio)
Declaracin de variables, apertura y cierre de
ficheros binarios
Tema 3
Declaracin de variables: como en los ficheros de
texto:
Ficheros de
texto
ifstream fbl; // fichero para lectura
Definicin ofstream fbe; // fichero para escritura
Declaracin
Apertura y cierre
Lectura
Escritura
Apertura del fichero: hay que aadir ios::binary
Ejercicios

Ficheros fbl.open("mifichero.dat", ios::in | ios::binary);


binarios fbe.open("mifichero.dat", ios::out | ios::binary);
Definicin
Declaracin,
apertura y cierre
Lectura Cierre del fichero: como en los ficheros de texto, con
Escritura
Ejercicios
close:
Errores
fbl.close();

Otros modos de apertura:


lectura/escritura ios::in | ios::out | ios::binary
aadir al final ios::out | ios::app | ios::binary
Lectura de un fichero binario

Tema 3

typedef struct { ... } TIPOCIUDAD;


Ficheros de ...
texto
Definicin
Declaracin TIPOCIUDAD ciudad;
Apertura y cierre
Lectura
Escritura
fbl.open("mifichero.dat",ios::in | ios::binary);
Ejercicios if (fbl.is_open())
Ficheros
{
binarios fbl.read((char *)&ciudad, sizeof(ciudad));
Definicin while (!fbl.eof())
Declaracin,
apertura y cierre {
Lectura // procesar ciudad
Escritura
Ejercicios
fbl.read((char *)&ciudad, sizeof(ciudad));
Errores
}
fbl.close();
}
Acceso directo a un elemento

Tema 3

La posicin de un elemento en el fichero se puede calcular


Ficheros de
texto
en funcin del tamao (sizeof) de lo que hay antes.
Definicin
Declaracin if (fbl.is_open())
Apertura y cierre
Lectura
{
Escritura // posicionar para leer el tercer elemento
Ejercicios
fbl.seekg ( (3-1)*sizeof(ciudad), ios::beg);
Ficheros fbl.read( (char *)&ciudad, sizeof(ciudad) );
binarios ...
Definicin
Declaracin, }
apertura y cierre
Lectura
Escritura
Ejercicios
Otras referencias para la posicin:
fbl.seekg( pos, ios::cur) desde la posicin actual
Errores
fbl.seekg( pos, ios::end) desde el final del fichero

OJO: pos puede ser negativo


Escritura de un fichero binario

Tema 3

Ficheros de typedef struct { ... } TIPOCIUDAD;


texto
Definicin
...
Declaracin
Apertura y cierre
TIPOCIUDAD ciudad;
Lectura
Escritura ofstream fbe;
Ejercicios

Ficheros fbe.open("mifichero.dat",ios::out | ios::binary);


binarios if (fbe.is_open())
Definicin
Declaracin,
{
apertura y cierre // rellenar ciudad
Lectura
Escritura
Ejercicios fbe.write((const char *)&ciudad, sizeof(ciudad));
Errores
...
}
Acceso directo a un elemento para escribir

Tema 3

Ficheros de Hay que utilizar el mtodo seekp (posicionamiento para


texto
Definicin
escritura) en lugar de la seekg (para lectura).
Declaracin
Apertura y cierre if (fbe.is_open())
Lectura
Escritura
{
Ejercicios // posicionar para escribir el tercer elemento
Ficheros fbe.seekp ( (3-1)*sizeof(ciudad), ios::beg);
binarios fbe.write( (const char *)&ciudad, sizeof(ciudad) );
Definicin
...
Declaracin,
apertura y cierre }
Lectura
Escritura
Ejercicios
ATENCIN: si la posicin a la que se va a ir con seekp no
Errores
existe en el fichero, se alarga el fichero para que se pueda
escribir.
Escritura/lectura de registros con cadenas de
caracteres
Tema 3

Ficheros de
texto
Si se desea almacenar un registro en un fichero binario que
Definicin contenga una cadena de caracteres, se debe utilizar un
Declaracin
Apertura y cierre vector de caracteres, nunca un string. Puede ser
Lectura
Escritura necesario recortar el string:
Ejercicios

Ficheros
binarios
Definicin
char cad[tcREG];
Declaracin, string s;
apertura y cierre
Lectura
Escritura ...
Ejercicios strncpy(cad,s.c_str(),tcREG-1);
Errores cad[tcREG-1]=\0; // strncpy no pone el \0 si no aparece
Informacin sobre la posicin actual

Tema 3

Ficheros de
texto
Definicin
Declaracin
La posicin actual del puntero de lectura (en bytes) se
Apertura y cierre
Lectura
puede ver mediante la funcin tellg, y la de escritura
Escritura mediante tellp. Ejemplo:
Ejercicios

Ficheros // Colocamos el puntero de lectura al final


binarios
Definicin
f.seekg(0,ios::end);
Declaracin,
apertura y cierre
Lectura
// Calculamos el numero de registros del fichero
Escritura cout << f.tellg()/sizeof(miRegistro) << endl;
Ejercicios

Errores
Ejercicios

Tema 3

Ejercicio 5
Ficheros de
texto Dado un fichero binario alumnos.dat que tiene registros
Definicin
Declaracin de alumnos, con la siguiente informacin por cada alumno:
Apertura y cierre
Lectura
dni vector de 10 caracteres
Escritura apellidos vector de 40 caracteres
Ejercicios
nombre vector de 20 caracteres
Ficheros
binarios turno entero
Definicin
Declaracin,
apertura y cierre
Lectura Haz un programa que imprima por pantalla el DNI de todos
Escritura
Ejercicios
los alumnos del turno 7.
Errores

Ampliacin: haz un programa que intercambie los alumnos


de los turnos 4 y 8 (los turnos van del 1 al 10).
Ejercicios

Tema 3

Ejercicio 6
Ficheros de Dado el fichero alumnos.dat del ejercicio anterior, haz
texto
Definicin un programa que pase a maysculas el nombre y los
Declaracin
Apertura y cierre apellidos del quinto alumno del fichero, y lo vuelva a escribir
Lectura
Escritura en el fichero.
Ejercicios

Ficheros Ejercicio 7
binarios
Definicin
Declaracin,
Disea un programa que construya el fichero
apertura y cierre
Lectura
alumnos.dat a partir de un fichero de texto alu.txt
Escritura
Ejercicios
en el que cada dato (dni, nombre, etc) est en una lnea
Errores distinta. Ten en cuenta que en el fichero de texto el dni,
nombre y apellidos pueden ser ms largos que los tamaos
especificados para el fichero binario, en cuyo caso se
deben recortar.
Ejercicios

Tema 3

Ejercicio 8
Ficheros de
texto
Escribe un programa que se encarge de la asignacin
Definicin
Declaracin
automtica de alumnos en 10 turnos de prcticas. A cada
Apertura y cierre
Lectura
alumno se le asignar el turno correspondiente al ltimo
Escritura
Ejercicios
nmero de su DNI (a los alumnos con DNI acabado en 0 se
Ficheros les asignar el turno 10). Los datos de los alumnos estn
binarios
Definicin
en un fichero alumnos.dat con la misma estructura que
Declaracin,
apertura y cierre en los ejercicios anteriores.
Lectura
Escritura La asignacin de turnos debe hacerse leyendo el fichero
Ejercicios
una sola vez, y sin almacenarlo en memoria. En cada paso
Errores
se leer la informacin correspondiente a un alumno, se
calcular el turno que le corresponde, y se guardar el
registro en la misma posicin.
Errores de lectura/escritura (1/2)

Tema 3

Ficheros de Se producen tanto en ficheros de texto como en


texto
Definicin
ficheros binarios
Declaracin
Apertura y cierre Es raro que se produzcan, pero hay que tenerlos
Lectura
Escritura previstos
Ejercicios

Ficheros Es recomendable comprobar que no hay errores


binarios
Definicin
despus de cada lectura/escritura
Declaracin,
apertura y cierre Se debe utilizar el mtodo fail (aunque hay otras
Lectura
Escritura
formas):
Ejercicios

Errores if (fi.fail() && !fi.eof()) // error de lectura


...
Errores de lectura/escritura (2/2)

Tema 3

if (fi.is_open())
Ficheros de {
texto bool error=false;
Definicin
Declaracin getline(fi,s);
Apertura y cierre if (fi.fail() && !fi.eof()) error=true;
Lectura
Escritura
while (!error && !fi.eof())
Ejercicios {
Ficheros
// hacer algo con s
binarios
Definicin getline(fi,s);
Declaracin,
apertura y cierre if (fi.fail() && !fi.eof()) error=true;
Lectura }
Escritura
Ejercicios
if (error)
Errores
// mensaje de error
fi.close();
}