1. Elementos de Programación
Ficheros
Elementos de Programaci ón. Ficheros. Curso 2002/2003 1
Índice
1. Introducción. Concepto de fichero
2. Generalidades sobre ficheros
3. Ficheros en C++
4. Librerías de manejo de ficheros en C++
5. Ficheros en C
6. Librerías de manejo de ficheros en C
7. Ejemplos
Elementos de Programaci ón. Ficheros. Curso 2002/2003 2
1
2. Concepto de fichero
FAlmacenamiento PERMANENTE de información que
reside en la memoria secundaria (disco).
Son independientes de los programas que los utilizan.
FCaracterísticas:
ü Residen en la memoria secundaria à Tamaño no limitado
por la memoria.
ü Utilizados por programas distintos.
ü Identificados por un nombre externo, dependiente del
sistema operativo, y un nombre interno, dependiente del
lenguaje de programación.
ü Contienen secuencias de bytes.
Elementos de Programaci ón. Ficheros. Curso 2002/2003 3
Generalidades sobre ficheros
F Modo de acceso:
ü Secuencial. Para acceder a un objeto se debe acceder a los objetos
almacenados previamente en el fichero.
ü Directo o Aleatorio. Se accede directamente al objeto, sin recorrer los
anteriores .
F Tipos de operación:
ü Lectura o Entrada.
ü Escritura o Salida.
F Formato de las operaciones:
ü E/S sin formato. Representación binaria de la información es igual en
memoria y en disco.
ü E/S con formato. Cambio en la representación a formatos legibles
humanamente.
Elementos de Programaci ón. Ficheros. Curso 2002/2003 4
2
3. Otras consideraciones sobre ficheros
FPunteros de los ficheros
ü Los ficheros tienen asociados un puntero de lectura y otro
de escritura que indican la posición donde se realizará la
siguiente operación de E/S.
ü En C los dos punteros son el mismo; en C++ hay uno para
cada operación.
FMarca de Fin de Fichero
ü No existe una marca almacenada en el fichero que indique
su fin.
ü Para su detección hay que usar las funciones feof() o eof().
ü Para que las funciones anteriores detecten el final de
fichero, debe leerse más allá del final de fichero.
Elementos de Programaci ón. Ficheros. Curso 2002/2003 5
Ficheros en C++
F C++ proporciona tres clases: fstream, ifstream y ofstream.
F Nombres internos de los ficheros (streams) à objetos de las
clases anteriores.
F Declaración de un objeto de uno de los tipos anteriores à
establece un canal de comunicación entre un programa y un
archivo almacenado en la memoria secundaria.
ios
istream
ifstream
iostream
ostream fstream
ofstream
Elementos de Programaci ón. Ficheros. Curso 2002/2003 6
3
4. Operaciones con ficheros en C++
F Apertura y creación de ficheros
void fstream::open(const char *name, int modo)
ü Abre el fichero “name” en el modo indicado. No retorna ningún valor.
ios::app Abre fichero (si no existe lo crea), para escribir al final de él
ios::ate Abre fichero (si no existe lo crea), para escribir en cualquier lugar
ios::in Abre fichero para entrada
ios::out Crea fichero para salida
ios::trunc Descarta el contenido del fichero (si existe)
ios::nocreate Si el fichero no existe, la operación de apertura falla
ios::noreplace Si el fichero existe, la operación de apertura falla
ios::binary Abre un fichero en modo binario
Elementos de Programaci ón. Ficheros. Curso 2002/2003 7
Operaciones con ficheros en C++
F Lectura secuencial con formato
fstream & operator >> (fstream &stream, tipo &var)
ü Modifica var con el contenido leido de stream. La lectura termina al
encontrar blanco, tabulador o salto de línea.
ü Retorna una referencia a stream.
F Escritura secuencial con formato
fstream & operator << (fstream &stream, tipo &var)
ü Modifica el fichero stream escribiendo en él el contenido de var.
ü Retorna una referencia a stream.
#include <fstream.h>
…… int x = 10, y;
ofstream f2; ifstream f3;
…… f2 << “ Escribo al fichero datos2.dat: “ << x << endl;
f2.open(“ datos2.dat ”); f3 >> y; // lectura del fichero “ datos3.dat ” un entero
f3.open(“ datos3.dat ”);
Elementos de Programaci ón. Ficheros. Curso 2002/2003 8
4
5. Operaciones con ficheros en C++
F Lectura secuencial sin formato (binaria)
istream & fstream::read (char * ptr, int size)
ü Lee size bytes del fichero stream y los almacena en la dirección
indicada por prt.
ü Retorna una referencia a stream.
F Escritura secuencial sin formato (binaria)
ostream & fstream::write (const char * ptr, int size)
ü Escribe size bytes al fichero stream desde la dirección indicada por ptr.
ü Retorna una referencia a stream.
#include <fstream.h>
…… int x = 10, y;
ofstream f2; ifstream f3;
…… f2.write((const char*) &x, sizeof(int));
f2.open(“ datos2.dat ”, ios::binary); f3.read ((char *) & y, sizeof(int);
f3.open(“ datos3.dat ”, ios::binary);
Elementos de Programaci ón. Ficheros. Curso 2002/2003 9
Operaciones con ficheros en C++
F Cierre de ficheros
fstream::close ()
ü Cierra el fichero y vacía todos los buffers asociados.
ü No retorna ningún valor.
F Detectar el fin de fichero
int ios::eof ()
ü Indica si se han leído todos los datos del fichero.
ü Retorna 0 si no llegó al final, distinto de 0 en caso contrario.
F Bytes leidos con read() (lectura sin formato)
int istream::gcount ()
ü Después de una operación de lectura binaria, indica cuántos bytes se
han leído del fichero.
ü Retorna el nú mero de bytes leídos de un stream.
Elementos de Programaci ón. Ficheros. Curso 2002/2003 10
5
6. Ficheros especiales en C++
FDefinidos en iostream.h
Fcin: Objeto de la clase istream conectado a la
entrada estándar (teclado).
Fcout: Objeto de la clase ostream conectado a la
salida estándar (pantalla).
Fcerr: Objeto de la clase ostream conectado a la
salida estándar de error (pantalla). Sin buffer.
Fclog: Objeto de la clase ostream conectado a la
salida estándar de error (pantalla). Con buffer.
Elementos de Programaci ón. Ficheros. Curso 2002/2003 11
Acceso secuencial y aleatorio
FLas operaciones de E/S provocan un desplazamiento
de los punteros del fichero equivalente al número de
bytes leídos/escritos El puntero queda apuntando al
siguiente byte.
FEn el acceso secuencial, los punteros no se desplazan si
no es con operaciones de E/S.
FEn el acceso aleatorio (o directo):
ü Uso de los métodos seekg, seekp, tellg y tellp (fstream.h)
Elementos de Programaci ón. Ficheros. Curso 2002/2003 12
6
7. Acceso aleatorio con ficheros en C++
istream& flectura.seekg(streamoff offset, seek_dir dir);
ü Desplaza el puntero de lectura del fichero flectura offset bytes desde la
ubicación indicada por dir. Valores de dir apropiados son:
– ios::beg desde el inicio de fichero.
– ios::cur desde la posición actual del fichero.
– ios::end desde el final de fichero.
ü Retorna una referencia al fichero flectura.
ostream& fescritura.seekp(streamoff offset, seek_dir dir);
ü Igual que seekg, pero para el puntero de escritura.
long flectura.tellg();
ü Retorna la posición actual (en bytes) del puntero de lectura del fichero
flectura, contando desde el principio de fichero.
long fescritura.tellp();
ü Igual que tellg, pero para el puntero de escritura.
Elementos de Programaci ón. Ficheros. Curso 2002/2003 13
Acceso aleatorio con ficheros en C++
FFicheros de entrada: istream
ü Definidos los métodos: tellg y seekg.
FFicheros de salida: ostream
ü Definidos los métodos: tellp y seekp.
FFicheros de entrada/salida: fstream
ü Presentan puntero de lectura y escritura à tienen definidos
los cuatro métodos.
ü Punteros de lectura y escritura se modifican
simultáneamente al llamar a los dos métodos (seekg y
seekp).
Elementos de Programaci ón. Ficheros. Curso 2002/2003 14
7
8. Ficheros en C
FC proporciona el tipo FILE.
FLos nombres internos de los ficheros (streams) son
punteros al tipo.
#include <stdio.h> // incluye el tipo y las operaciones con ficheros
FILE *f; // declaración
Elementos de Programaci ón. Ficheros. Curso 2002/2003 15
Operaciones con ficheros en C
F Apertura y creación de ficheros
FILE *fopen(const char *name, const char * modo)
ü Abre el fichero “name” en el modo indicado. No retorna ningún valor.
r Abre fichero para lectura al principio (entrada)
w Abre fichero para escritura al principio (salida)
a Abre fichero (si no existe lo crea), para escribir al final de él
r+ Abre fichero existente para actualización (lectura o escritura)
w+ Abre fichero, si existe lo sobreescribe, para actualización (lectura o escritura)
a+ Abre fichero (si no existe lo crea), para actualización (lectura o escritura)
t Abre fichero en modo texto
b Abre fichero en modo binario
Elementos de Programaci ón. Ficheros. Curso 2002/2003 16
8
9. Operaciones con ficheros en C
F Lectura secuencial con formato
int fscanf(FILE * stream, const char *formato [, ptr,...])
ü Modifica el contenido de las direcciones de las variables ptr con los valores
leídos de stream.
ü Retorna el número de campos de entrada escaneados y almacenados en las
variables respectivas. Si se lee más allá del final de fichero retorna EOF.
F Escritura secuencial con formato
int fprintf(FILE * stream, const char *formato [, arg,...])
ü Escribe en stream la información de arg en el formato indicado.
ü Retorna el número de bytes escritos. En caso de error retorna EOF.
F Formato
d entero (int)
ld entero largo (long)
f real (float )
lf real largo (double)
s string (char *, char[ ])
c carácter (char)
Elementos de Programaci ón. Ficheros. Curso 2002/2003 17
Operaciones con ficheros en C
F Lectura secuencial sin formato (binaria)
size_t fread(void *ptr, size_t size , size_t n, FILE *stream)
ü Lee n bloques de tamaño size del fichero stream sobre la dirección de
memoria prt.
ü Retorna el nú mero de bloques leídos. Si hay error, retorna un número
menor que n.
F Escritura secuencial sin formato (binaria)
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream)
ü Escribe n bloques de tamaño size al fichero stream desde la dirección
indicada por ptr.
ü Retorna el nú mero de bloques leídos. Si hay error, retorna un número
menor que n.
Elementos de Programaci ón. Ficheros. Curso 2002/2003 18
9
10. Operaciones con ficheros en C
F Cierre de ficheros
int fclose (FILE* stream)
ü Cierra el fichero y vacía todos los buffers asociados.
ü Retorna 0 en caso de éxito y EOF en caso de error.
F Detectar el fin de fichero
int feof (FILE *stream)
ü Indica si se han leído todos los datos del fichero.
ü Retorna 0 si no llegó al final, distinto de 0 en caso contrario.
F Borrado de ficheros
int remove (const char * name)
ü Borra el fichero de nombre name del sistema de ficheros.
ü Retorna 0 en caso de éxito y -1 en caso de error.
Elementos de Programaci ón. Ficheros. Curso 2002/2003 19
Ficheros especiales en C
F Definidos en stdio.h
F stdin: Fichero conectado a la entrada estándar (teclado).
F stdout: Fichero conectado a la salida estándar (pantalla).
F stdcerr: Fichero conectado a la salida estándar de error
(pantalla). Sin buffer.
F Funciones de E/S asociadas a los ficheros especiales:
– printf: igual que fprintf pero con stdout como parámetro por defecto
para FILE *stream.
– scanf: igual que fscanf pero con stdin como parámetro por defecto
para FILE *stream.
Elementos de Programaci ón. Ficheros. Curso 2002/2003 20
10
11. Acceso aleatorio con ficheros en C
ü Uso de las funciones rewind, fseek, ftell (stdio.h).
void rewind(FILE *stream);
ü Posiciona el puntero del fichero stream al principio.
ü Retorna nada.
int fseek(FILE * stream, long offset, int whence);
ü Posiciona el puntero del fichero stream en offset bytes desde donde
indique whence. Valores de whence:
– 0 desde el inicio de fichero.
– 1 desde la posición actual del fichero.
– 2 desde el final de fichero.
ü Retorna 0 si la operación tuvo éxito y cualquier otro valor en caso de
error.
long int ftell(FILE * stream);
ü Retorna la posición actual (en bytes) del puntero del fichero stream
contando desde el principio del fichero. En caso de error retorna.
Elementos de Programaci ón. Ficheros. Curso 2002/2003 21
11