Teoría de Archivos en C

download Teoría de Archivos en C

of 8

description

Apertura de Archivos, lectura, cierre. Tipo binarios y de texto. Operaciones con archivos.

Transcript of Teoría de Archivos en C

  • Archivosconceptos

    Contienen los datos que se almacenan en dispositivos de almacenamientomasivo: disquetes, discos duros, DROM, etc.

    Conjunto de datos relacionados entre si. Organizacin de los datos:

    0 Sin una estructura regular: texto, cdigo C.0 En registros.

    Apellido1 Apellido2 Nombre Edad Telf.

    Registros Gmez Gmez Juan 35 60433423

    Prez Mrquez Luca 20 95545434

    Campos

    Manejo de Archivos en C

    Los tipos de datos y funciones necesarias para el manejo de Archivos seencuentran en la libreria de entrada/salida estndar stdio (standardinput/output).0 #include

    Los Archivos se manejan utilizando variables de tipo FILE *0 Ejemplos:

    El asterisco debe aparecer delanteFILE *archivo; del nombre de la variable.FILE *nominas, *ventas;

    0 Estas variables pueden tener un valor nulo que se representa por la constante NULL.

    Los pasos generales para manejar Archivos son los siguientes:0 Abrir el archivo.0 Realizar las operaciones de entrada/salida (lectura y/o escritura de datos en el

    archivo).0 Cerrar el archivo.

    Apertura del archivoFunciOn fopen

    Mediante la apertura asociamos el archivo con una variable de tipo FILE* Una vez realizada la apertura, la variable se utiliza para acceder al archivo. Se utiliza la siguiente funciOn:

    FILE *fopen( char nombre[], char modo[] );

    0 Parmetros: nombre: Es una cadena de caracteres que contiene el nombre del archivo.

    Puede contener la ruta. modo: Es una cadena de caracteres que indica el modo de apertura del archivo.

    Puede contener los siguientes valores:0 rt El archivo se abre para leer.0 wt El archivo se abre para escribir. Se borra y se escribe al principio.0 at El archivo se abre para aadir. Se aaden los datos al final.

    0 Valor devuelto: Si el archivo no ha podido abrirse, devuelve NULL. Si el archivo se ha abierto correctamente, devuelve un valor de tipo FILE* que

    se puede utilizar para acceder al archivo.

    Apertura del archivoFuncin fopen: nombre del archivo

    Para especificar el nombre delarchivo con la ruta de acceso, seutiliza la siguiente sintaxis:

    E:\\clases\\FI\\ejemplo.txt

    Cada elemento de la ruta (unidad, carpeta y archivo) seseparan con la doble barra invertida \\

  • Apertura del archivoFuncin fopen: modo de apertura

    Existen tres modos de apertura:0 Lectura (rt)

    Este modo se utiliza para leer datos del archivo. Si el archivo no existe, no se puede abrir y fopen devuelve NULL.

    0 Escritura (wt) Este modo se utiliza para escribir datos en el archivo desde el principio. Si el archivo existe, se borra su contenido. Si el archivo no existe, se crea un archivo nuevo vaco con el nombre indicado. Deben existir todas las carpetas de la ruta especificada; si alguna no existe,

    fopen no podr abrir el archivo.0 Aadir (at)

    Este modo se utiliza para escribir datos al final del archivo. Si el archivo existe, se mantiene su contenido. Si el archivo no existe, se crea un archivo nuevo vaco con el nombre indicado. Deben existir todas las carpetas de la ruta especificada; si alguna no existe,

    fopen no podr abrir el archivo.

    Apertura del archivoFunciOn fopen: ejemplo 1a

    Abrimos el archivo prueba1.txt para escritura.#include Si el archivo existe, se borra su contenido.void main() {

    FILE *fa, *fb;fa = fopen( c:\\dir1\\prueba1.txt, wt );if (fa == NULL) {

    printf( Error\n ); Comprobamos si el archivo se hareturn; podido abrir.

    }

    El valor devuelto por fopen se guarda en fa. Ahora podemosutilizar fa para acceder al archivo prueba1.txt.

    fb = fopen( c:\\dir1\\prueba2.txt, wt );if (fb == NULL) {

    printf( Error\n );return; Podemos abrir ms de un archivo

    }... Resto de sentencias del programa

    }

    Apertura del archivoFunciOn fopen: ejemplo 1b

    El programa anterior se puede escribir de la siguiente manera:

    #include void main() {

    FILE *fa, *fb;fa = fopen( c:\\dir1\\prueba1.txt, wt );if (fa == NULL) {

    printf( Error\n );}else {

    fb = fopen( c:\\dir1\\prueba2.txt, wt );if (fb == NULL) {

    printf( Error\n );}else {

    ... Resto de sentencias del programa}

    }

    }

    Escritura de datos en el archivoFunciOn fprintf

    La funciOn fprintf se utiliza igual que printf. Diferencias entre fprintf y printf:

    0 La funciOn fprintf tiene un primer parmetro de tipo FILE*0 La funciOn fprintf escribe en el archivo indicado por su primer parmetro (en vez

    de hacerlo por pantalla).

    int fprintf( FILE *f, char texto_de_formato[], ... );

    Contiene informaciOn Contiene el texto que se va a Valores que se vansobre el archivo en el que escribir (junto con los cOdigos de a imprimir dentrose va a escribir. formato: %d, %f, etc). del texto.

    La funcin fprintf devuelve el n de bytes o caracteres escritos en el archivo.En caso de error, devuelve un valor negativo.

  • Escritura de datos en el archivoFunciOn fprintf: ejemplo 1a

    #include void main() { Se crea o se prueba1.txt

    FILE *fa, *fb; borra el archivoint i;fa = fopen( c:\\dir1\\prueba1.txt, wt );if (fa == NULL) {

    printf( Error\n );return;

    }fb = fopen( c:\\dir1\\prueba2.txt, wt );if (fb == NULL) { prueba2.txt

    printf( Error\n );return; Se crea o se

    } borra el archivo

    Contina...

    Escritura de datos en el archivoFunciOn fprintf: ejemplo 1b

    prueba1.txtEste es el archivo falnea 1lnea 2lnea 3

    fprintf( fa, Este es el archivo fa\n );fprintf( fb, Este es el archivo fb\n );for (i=1; i

  • Cierre del archivoFuncin fclose: ejemplo

    fclose(fa); Cierre de los Archivos: el programa no va a seguirfclose(fb); escribiendo en los Archivos.

    fb = fopen( c:\\tmp\\prueba3.txt, rt );...

    } Las variables fa y fb ya no estnasociadas a ningn archivo.

    Podemos volver a utilizar fb para abrir un nuevoarchivo y realizar operaciones de entrada/salidasobre l.

    Funciones de escritura de ArchivosFuncin fputs

    int fputs( char cad[], FILE *fich );

    0 Escribe el contenido de la cadena de caracteres cad en el archivo asociado a fich.0 Devuelve un valor >= 0 si la escritura se ha realizado sin problemas. En caso de error,

    devuelve el valor EOF.0 Ejemplo:

    FILE *f = fopen( c:\\tmp\\prueba.txt, wt );char texto[] = una prueba;fputs( Esto es , f ); prueba.txtfputs( texto, f ); Esto es una prueba

    Funciones de escritura de ArchivosFuncin fputc

    int fputc( int caracter, FILE *fich );

    0 Escribe en el archivo asociado a fich el carcter contenido en el parmetro caracter.0 Devuelve el carcter escrito si la escritura se ha realizado sin problemas. En caso de

    error, devuelve el valor EOF.0 Ejemplo:

    FILE *f = fopen( c:\\tmp\\prueba.txt, wt );fputc( A, f ); prueba.txtfputc( 66, f ); AB

    66 es el cdigoASCII del carcter B

    Lectura de datos del archivoPosicin de lectura

    Posicin de lectura: llamaremos posicin de lectura al punto, dentro del archivo,donde se comenzar a leer los datos.

    Cuando se abre un archivo para leer (modo rt), la posicin de lectura se sitaal principio del archivo.

    Cada vez que se leen datos del archivo, la posicin de lectura avanza para quela siguiente lectura comience en el lugar donde terminO la anterior.

    Ejemplo:

    Inicialmente, Esto es una pruebala posicin delectura est alprincipio.

    Si leemos 4 Si leemos 6 caracteres, lacaracteres, la posicin de lectura vuelve aposicin de avanzar.lectura avanza.

  • Cie

    rre

    Proc

    esad

    oA

    pert

    ura

    Lectura de datos del archivoFuncin fscanf

    La funcin fscanf se utiliza igual que scanf. Diferencias entre fscanf y scanf:

    0 La funcin fscanf tiene un primer parmetro de tipo FILE*0 La funcin fscanf lee los datos del archivo indicado por su primer parmetro (en vez

    de leerlos del teclado).

    int fscanf( FILE *f, char formato[], ... );

    Contiene informacin Contiene los cdigos de formato de Variables en las quesobre el archivo en el que los valores que se van a leer (%d, se van a guardar los seva a leer. %f, etc). datos ledos.

    La funcin fscanf devuelve el n de valores que han sido ledos del archivo yalmacenados en las variables. Si no ha podido leer ms valores porque hallegado al final del archivo, devuelve EOF.

    Lectura de datos del archivoFuncin fscanf: cdigos de formato

    Se considera un separador a los siguientes caracteres:0 Carcter espacio: 0 Salto de lnea: \n0 Tabulador: \t

    Lectura de valores numricos: %d, %u, %f, %lf, etc0 Se salta todos los separadores hasta encontrar el principio de un nmero:

    un digito, +, - o .(para los tipos float y double)0 Si antes de encontrar un nmero, encuentra un carcter distinto de los

    anteriores, la lectura termina y no se lee ningn valor numrico del archivo. Lectura de cadena de caracteres: %s

    0 Se salta todos los separadores hasta encontrar un carcter distinto0 Lee una cadena de caracteres delimitada por separadores

    Lectura de caracteres: %c0 fscanf no se salta ningn carcter, lee el primer carcter que encuentre.

    Lectura de datos del archivoFunciOn fscanf: ejemplo

    Posicin de lectura#include

    void main() { 3.45float v1;int v2; 5.2char c1, c2, c3;FILE *f = fopen( c:\\dir1\\ejemplo.txt, rt );if (f != NULL) { 3.45

    fscanf( f, %f, &v1 ); 5.2fscanf( f, %d, &v2 );fscanf( f, %d, &v2 );fscanf( f, %c%c, &c1, &c2 ); En la posicin de lectura hay un .

    } No se puede leer un nmero entero.

    . 2 La variable v2 conserva su valor (5).fclose(f);3.45

    5.2}

    NOTA: el simbolo () representa un salto de linea

    Funciones de lectura de ArchivosFunciOn fgets

    char *fgets( char cadena[], int max, FILE *fich );

    0 Lee una secuencia de caracteres del archivo asociado al parmetro fich y los almacenaen el parmetro cadena.

    0 La lectura termina cuando se hayan leido max-1 caracteres, se encuentre un salto delinea o se acabe el archivo.

    0 Si se encuentra un salto de lnea, este se incluir en la cadena.0 Ejemplo:

    FILE *f = fopen( c:\\tmp\\prueba.txt, rt );char cad[80];fgets( cad, 80, f );prueba.txt

    fgets( cad, 6, f ); Esto esuna prueba

  • Funciones de lectura de ArchivosFunciOn fgetc

    int fgetc( FILE *fich );

    0 Lee un carcter del archivo asociado al parmetro fich.0 Devuelve el carcter leido. Si no se puede leer ningn carcter, devuelve el valor EOF.0 Ejemplo:

    FILE *f = fopen( c:\\tmp\\prueba.txt, rt );char c1, c2;c1 = fgetc( f ); prueba.txt

    c2 = fgetc( f ); Esto esuna prueba

    DetecciOn del fin del archivoFunciOn feof

    Cuando la posicin de lectura del archivo se encuentra al final del archivo, no sepuede seguir leyendo.

    Durante la lectura de datos de un archivo, el programa debe comprobar si se hallegado al final del archivo.

    La siguiente funcin nos permite detectar si se ha llegado al final del archivo:

    int feof( FILE *fich );

    0 Valor devuelto: VERDADERO (distinto de cero): Si en la ltima operacin de lectura se ha

    intentado leer fuera del archivo; es decir, si se ha intentado leer despus dellegar al final del archivo.

    FALSO (cero): En caso contrario

    ArchivosTratamiento secuencial

    La secuencia de pasos que seguiremos para el tratamiento secuencial deArchivos es la siguiente:

    Abrir archivoLeer un registroMIENTRAS no sea fin de archivo HACER

    Procesar el registro ledoLeer un registro

    FIN MIENTRASCerrar archivo

    ArchivosTratamiento secuencial: ejemplo 1a

    Realizar un programa que lea los registros de un archivo de temperaturas que contiene unentero por cada lnea (cada lnea corresponde a un registro). El programa debe imprimir porpantalla los valores ledos.

    #include void main() {

    int valor;FILE *f = fopen( c:\\ejemplo.txt, rt );if (f == NULL) {

    printf( ERROR\n ); Abrimos el archivoreturn;

    }fscanf( f, %d, &valor ); Leemos un registrowhile (!feof(f)) {

    printf( %d\n, valor ); Procesamos el registrofscanf( f, %d, &valor );

    }fclose(f);

    }

  • ArchivosTratamiento secuencial: ejemplo 1b

    Si el ltimo registro no termina con un salto de lnea, el valor de dicho registro no aparece enpantalla (no es procesado).

    #include void main() {

    int valor;FILE *f = fopen( c:\\ejemplo.txt, rt );if (f == NULL) { Supongamos que la posicin de lectura se

    printf( ERROR\n ); encuentra en la marca ( ) y que se va areturn; ejecutar la siguiente lnea}

    fscanf( f, %d, &valor );while (!feof(f)) { 45

    printf( %d\n, valor ); 5fscanf( f, %d, &valor ); 10

    }fclose(f);

    } Se saltan los separadores Se lee el Se intenta leerhasta encontrar el carcter fuera delarchivo. carcter 1. 0.

    ArchivosTratamiento secuencial: ejemplo 2a

    Tenemos un archivo temp.txt con las temperaturas en C de tres sensores (llamados A, By C). El siguiente programa copia las temperaturas del sensor A en un archivo llamadotemp_a.txt.

    Cada lnea del archivo corresponde a un registro que contiene el nombre del sensor(un carcter) y la temperatura (un entero) separados por un espacio.

    Por ejemplo, para el siguiente archivo temp.txt, debe generarse el archivo temp_a.txt quese muestra:

    temp.txt Temp_a.txt

    A 45 45B 60 55A 55C 32

    ArchivosTratamiento secuencial: ejemplo 2b

    #include void main() {

    FILE *ftemp, *fsal;char sensor, aux;int temp;ftemp = fopen( c:\\dir\\temp.txt, rt ); Abrimos el archivoif (ftemp == NULL) { en modo lectura

    printf( ERROR\n );return;

    }fsal = fopen( c:\\dir\\temp_a.txt, wt ); Abrimos el archivoif (fsal == NULL) { en modo escritura

    printf( ERROR\n );fclose( ftemp ); Antes de terminar, debemosreturn; cerrar el archivo temp.txt

    }

    Contina...

    ArchivosTratamiento secuencial: ejemplo 2c

    fscanf( ftemp, %c, &sensor ); Leemos un registro del archivofscanf( ftemp, %d, &temp ); temp.txtfscanf( ftemp, %c, &aux );while (!feof(ftemp)) {

    if (sensor == a) { Procesamos el registro leido yfprintf( fsal, %d\n, temp ); escribimos un registro en el archivo

    } temp_a.txtfscanf( ftemp, %c, &sensor );fscanf( ftemp, %d, &temp ); Leemos un registro del archivofscanf( ftemp, %c, &aux ); temp.txt

    }fclose( ftemp );

    Cerramos todos los Archivosfclose( fsal );}

  • ArchivosTratamiento secuencial: ejemplo 2d

    Lectura de un registro del archivo temp.txt:

    fscanf( ftemp, %c, &sensor );fscanf( ftemp, %d, &temp );fscanf( ftemp, %c, &aux );

    La variable aux se utiliza para leerel salto de lnea del registro yconseguir que la posicin de lecturase site al principio del siguienteregistro

    A 45B 60A 55C 32