Selecciona el Idioma

sábado, 24 de mayo de 2014

ficheros de programación


FICHEROS EN MODO TEXTO



Empecemos con un ejemplo:



#include <#stdlib.h>
#include <#stdio.h>

int main ()
{
FILE *pfc;
FILE *pf;
int i;
int num_caracteres=0;
char c[50];
if (((pf = fopen("c:\\ficheros\\prueba.txt", "r")) == NULL) || 
    ((pfc = fopen("c:\\ficheros\\contar_caracter.txt","w")) == NULL)) 
          {
                 if (pf != NULL) fclose (pf) ; 
                     if (pfc != NULL) fclose (pfc) ; 
                        printf ("Error en la apertura de ficheros de salida \n" ); 
                        system("pause");
                    return 1; 
                    
            }
    while (! feof (pf))
    {
        for (i=0;i<=5;i++)
        {
         c[i] = fgetc ( pf);
         fputc(c[i],pfc) ;
           if (c[i] ==' ' )
            ++num_caracteres;
           
        }
    }
        
   
    printf("Hay " "%d " "espacios  blancos\n",num_caracteres);
   
    
       

    fclose(pf);
    fclose (pfc);  
    system("pause");
    return 0;
}

En el ejemplo anterior lo que estamos haciendo es: Abrir 2 ficheros uno de lectura "r"(previamente creado) y otro en modo escritura "w".
En el primer condicional decimos, quesi alguno de los dosesta vacío, pase al siguiente condicional que decimos en este otro que si el fichero de lectura esta vacío entrege un mensaje por pantalla: "Error en la apertura de ficheros de salida".
Después creamos un bucle (while) ue decimos que mientras el archivo NO llegue a su fnial de archivo haga:
un for que la variable c[i] valdrá igual al caracter del archivo i a continuación pondrá este valor en el archivo de escritura. i para finalizar un condicional con variable contador que contara los espacios en blanco del archivo. diciendo quesi c[i] es == ' ' a espacio en blanco.
se sume un valor másal contador.
Ahora solo nos queda hacer un printf ("Hay" "%d" "espacios blancos\n", num_caracteres);
se cierran los archivos y se hace un system("pause"); para poder ver el mensaje que entrega la consola por pantalla.

Ahora si vamos a la ubicación del archivo es decir a c:\ficheros\ encontraremos un archivo de texto creado con el nombre contar_caracter.txt que contiene la información guardada del fichero prueba.txt y nos muestra el mensaje por terminal al ejecutarlo.
VEAMOS OTROS EJEMPLOS PARECIDOS:
En este caso muy similar anterior pero aquí contamos el numero de caracteres del archivo de texto.

MODO DE APERTURA:


Existen varios modos de apertura para ficheros:
  • r Abrir sólo para lectura
  • w Crear para escribir.Sobreescribe el fichero si ya existía o lo crea si no existía antes
  • a Añade al final del fichero si existía o lo crea si no existía antes
  • + Se escribe a continuación de los modos anteriores para indicar que también queremos modificar.Por ejemplo r+ permite leer y escribir el fichero
  • t modo texto, después de la opción r,a o w
  • b modo binario, después de la opción r,a o w


FICHEROS EN MODO BINARIO


Los ficheros binarios son ficheros que pueden contener información de cualquier tipo. NO hemos de pensar en ficheros binarios, como en ficheros que contienen sólo zeros y unos (0,1,0,1,0) NO!!!!

En este caso se utiliza fread para leer un bloque de datos y fwrite para guardar un bloque de datos. Estos datos que leeremos se guardan en un búfferde memoria. En el momento en que se lean menos bytes de los que hemos pedido, quiere decir que hemos llegado a final de fichero.

En general el manejo de fread es el siguiente:
cantleida=fread(donde,tamañaodecadadato,cuantosdatos,fichero);
Por ejemplo para leer 10 números enteros de un fichero (cada uno de los cuales ocuparía 4 bytes , si estamos en un sistema operativo de 32 bits), haríamos:

int datos[10];
resultado=fread(&datos,4,10,fichero);
if(resultado < 10)
printf("Había menos de 10 datos!\n");


Igual que ocurría con scanf, la variable en la que guardaremos los datos se deberá indicar precedida del símbolo &, por motivos de búffer de memoria.
También como en scanf si se trata de una cadena (porque vayamos a leer una cadena de carácteres o datos de cualquier tipo pero con la intención de manejarlos byte a byte)comochar dato[500] no será necesario indicar ese símbolo & como por ejemplo:

char cabecera[40];
resultado=fread(cabecera,1,40,fichero);
if(resultado < 40)
printf ("Formato de fichero incorrecto, no está toda la cabecera!");
else
printf("El byte en la posición 5 es un %d",cabecera[4]);

Los cambios con ls ficheros de texto son:

  • Ficheros pueden ser de NO texto de modo que leemos uno como binario ("rb") y escribimos otro también como binario ("wb")
  • Definimos un búffer de 2048 bytes, para ir leyendo por bloques (y guardando después cada bloque en el otro fichero de escritura)
  • En la misma linea intento abrir el archivo y compruebo si todo ha sido correcto con:
    • if (fich=fopen("c:\\ficheros\\ficheroprueba.txt" ,"rb")== NULL)

Esto puede resultar menos legible que hacerlo en dos lineas separadas , cmo hemos hecho antes, pero es más compacto y sobretodo muy frecuente en ficheros más avanzados.
A fread le digo que queremos ponerle 2048 datos de 1 byte cada uno . El nos devuelve la cantidad de bytes que ha leído realmente. Suele ser preferible indicar que queremos leer el tamaño del bloque usando sizeoff:
cantidad=fread(búffer,1,sizeof(búffer),fichero);
Cuando la cantidad leída sea menos de 2048 bytes, es que el fichero se ha acabado (lo podemos comprobar mirando esta cantidad o con feof)

fwrite, se maneja igual que fread, se le indica donde estan los datos, el tamaño de cada dato, cuantos datos hay que escribir y en que fichero almacenarlos.En este ejemplo, el número de bytes que debe escribir será el que haya leído:
fwrite(búffer,1,cantidad,ficherodestino);


ACCEDER A CUALQUIER POSICIÓN DE UN FICHERO


Para esto se usa fseek:
int fseek(FILE *fichero,long posición,int desde);)
Es de tipo int, lo que quiere decir que devolverá un valor numérico. Para comprobar si todo ha ido correcto , si el valor es 0,todo ha ido bien, si por el contrario es otro, indicara un error(normalmente,que no hemos abierto el fichero).
fichero, indica el fichero dentro de el que queremos saltar. Debe estar abierto previamente con fopen.
posición, nos permite decir a que posición queremos saltar pr ejemplo a la 5010.
desde, es para afinar más, la dirección que hemos indicado con posición puede estar referida al comienzo, a la posición en la que nos encontramos o al final del fichero.
se usan las constantes:
SEEK_SET(0):Principio
SEEK_CUR(1):Actual
SEEK_END(2):Final

EJEMPLOS DE SU USO:
Ir a la posición 10 del fichero: fseek(fichero,10,SEEK_SET);
Avanzar 5 posiciones desde la posición actual: fseek(fichero,5,SEEK_CUR);
Ir a la posición 8 antes del final de fichero:fseek(fichero,-8,SEEK_END);
Finalmente si queremos saber en que posición de un fichero estamos, podemos usar ftell(fichero)
Esta orden permite saber la longitud de un fichero: nos posicionamos primero al final con fseek y después comprobamos con ftell en que posición estamos:

fseek(fichero,0,SEEK_END);
longitud=ftell(fichero);




Espero que os sirva de ayuda,
para más info suscribete a Desy Repara

No hay comentarios:

Publicar un comentario