Post on 13-Jun-2015
1
Elementos de Programación
Ficheros
Elementos de Programación. Ficheros. Curso 2002/2003 1
Índice1. Introducción. Concepto de fichero2. Generalidades sobre ficheros3. Ficheros en C++4. Librerías de manejo de ficheros en C++5. Ficheros en C6. Librerías de manejo de ficheros en C7. Ejemplos
Elementos de Programación. Ficheros. Curso 2002/2003 2
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 ficherosFModo 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.
FTipos 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
3
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.
Otras consideraciones sobre ficheros
Elementos de Programación. Ficheros. Curso 2002/2003 5
FC++ proporciona tres clases: fstream, ifstream y ofstream.
FNombres internos de los ficheros (streams) à objetos de las clases anteriores.
FDeclaració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.
Ficheros en C++
Elementos de Programación. Ficheros. Curso 2002/2003 6
ios
istream
ifstream
ofstream
iostream
ostream fstream
4
Operaciones con ficheros en C++
Elementos de Programación. Ficheros. Curso 2002/2003 7
FApertura 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.
Abre un fichero en modo binarioios::binary
Si el fichero existe, la operación de apertura fallaios::noreplace
Si el fichero no existe, la operación de apertura fallaios::nocreate
Descarta el contenido del fichero (si existe)ios::trunc
Crea fichero para salida ios::out
Abre fichero para entradaios::in
Abre fichero (si no existe lo crea), para escribir en cualquier lugarios::ate
Abre fichero (si no existe lo crea), para escribir al final de élios::app
Operaciones con ficheros en C++
Elementos de Programación. Ficheros. Curso 2002/2003 8
FLectura secuencial con formatofstream & 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.
FEscritura secuencial con formatofstream & operator << (fstream &stream, tipo &var)ü Modifica el fichero stream escribiendo en él el contenido de var.ü Retorna una referencia a stream.
#include <fstream.h>… …ofstream f2; ifstream f3;… …f2.open(“datos2.dat ”);f3.open(“datos3.dat ”);
int x = 10, y;
f2 << “Escribo al fichero datos2.dat: “ << x << endl;f3 >> y; // lectura del fichero “datos3.dat ” un entero
5
Operaciones con ficheros en C++
Elementos de Programación. Ficheros. Curso 2002/2003 9
FLectura secuencial sin formato (binaria)istream & fstream::read (char * ptr, int size)ü Lee size bytes del fichero streamy los almacena en la dirección
indicada por prt.ü Retorna una referencia a stream.
FEscritura 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>… …ofstream f2; ifstream f3;… …f2.open(“datos2.dat ”, ios::binary);f3.open(“datos3.dat ”, ios::binary);
int x = 10, y;
f2.write((const char*) &x, sizeof(int));f3.read((char *) & y, sizeof(int);
Operaciones con ficheros en C++
Elementos de Programación. Ficheros. Curso 2002/2003 10
FCierre de ficherosfstream::close ()ü Cierra el fichero y vacía todos los buffers asociados.ü No retorna ningún valor.
FDetectar el fin de ficheroint 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.
FBytes 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.
6
Ficheros especiales en C++
Elementos de Programación. Ficheros. Curso 2002/2003 11
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.
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
7
Acceso aleatorio con ficheros en C++
Elementos de Programación. Ficheros. Curso 2002/2003 13
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.
Acceso aleatorio con ficheros en C++
Elementos de Programación. Ficheros. Curso 2002/2003 14
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).
8
FC proporciona el tipo FILE.FLos nombres internos de los ficheros (streams) son
punteros al tipo.
Ficheros en C
Elementos de Programación. Ficheros. Curso 2002/2003 15
#include <stdio.h> // incluye el tipo y las operaciones con ficheros
FILE *f; // declaración
Operaciones con ficheros en C
Elementos de Programación. Ficheros. Curso 2002/2003 16
FApertura 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.
Abre fichero para lectura al principio (entrada)r
Abre fichero para escritura al principio (salida)w
Abre fichero en modo binariob
Abre fichero en modo textot
Abre fichero (si no existe lo crea), para actualización (lectura o escritura)a+
Abre fichero, si existe lo sobreescribe, para actualización (lectura o escritura)w+
Abre fichero existente para actualización (lectura o escritura)r+
Abre fichero (si no existe lo crea), para escribir al final de éla
9
Operaciones con ficheros en C
Elementos de Programación. Ficheros. Curso 2002/2003 17
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 Formatod entero (int)ld entero largo (long)f real (float )lf real largo (double)s string (char *, char[ ])c carácter (char)
Operaciones con ficheros en C
Elementos de Programación. Ficheros. Curso 2002/2003 18
FLectura 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 streamsobre la dirección de memoria prt.
ü Retorna el número de bloques leídos. Si hay error, retorna un número menor que n.
FEscritura 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 streamdesde la dirección indicada por ptr.
ü Retorna el número de bloques leídos. Si hay error, retorna un número menor que n.
10
Operaciones con ficheros en C
Elementos de Programación. Ficheros. Curso 2002/2003 19
FCierre de ficherosint 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.
FDetectar el fin de ficheroint 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.
FBorrado de ficherosint 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.
Ficheros especiales en C
Elementos de Programación. Ficheros. Curso 2002/2003 20
FDefinidos 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.
11
Acceso aleatorio con ficheros en C
Elementos de Programación. Ficheros. Curso 2002/2003 21
ü 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 streamcontando desde el principio del fichero. En caso de error retorna.