MANEJO DE ARCHIVOS.

octubre 1, 2007

MANEJO DE ARCHIVOS.

El estándar de C contiene funciones varias para la edición de ficheros, estas están definidas en la cabecera stdio.h y por lo general empiezan con la letra f, haciendo referencia a file. Adicionalmente se agrega un tipo FILE, el cual se usará como apuntador a la información del fichero. La secuencia que usaremos para realizar operaciones será la siguiente:

  • Crear un apuntador del tipo FILE
  • Abrir el archivo utilizando la función fopen y asignándole el resultado de la llamada a nuestro apuntador.
  • Hacer las diversas operaciones (lectura, escritura, etc).
  • Cerrar el archivo utilizando la función fclose.

Los prototipos correspondientes de fopen y fclose son:

FILE * fopen (const char *filename, const char *opentype);

int fclose (FILE *stream);

Un ejemplo pequeño para abrir y cerrar el archivo llamado fichero.in en modo lectura:

 #include <stdio.h>
 int main ( int argc, char **argv ) {
   FILE *fp;
   fp = fopen ( "fichero.in", "r" );
   fclose ( fp );
   return 0;
 }
 

Como vemos, en el ejemplo se utilizó el opentype “r”, que es para la lectura, aquí hay una lista de ellos:

  • “r” : abrir un archivo para lectura
  • “w” : abrir un archivo para escritura
  • “a” : abrir un archivo para escritura al final del contenido
  • “r+” : abrir un archivo para lectura y escritura
  • “w+” : crear un archivo para lectura y escritura
  • “a+” : abrir/crear un archivo para lectura y escritura al final del contenido

Adicionalmente hay tipos utilizando “b” (binary) los cuales no serán mostrados por ahora y que solo se usan en los sistemas operativos que no pertenecen a la familia de unix.

Un archivo debe verse como un string (una cadena de caracteres) que esta guardado en el disco duro. Para trabajar con los archivos existen diferentes formas y diferentes funciones. Las funciones que podríamos usar para leer un archivo son:

  • int fgetc(FILE *archivo)
  • char *fgets(char *buffer, int tamano, FILE *archivo)
  • size_t fread(void *puntero, size_t tamano, size_t cantidad, FILE *archivo);

Las primeras dos de estas funciones son muy parecidas entre si. Pero la tercera, por el numero y el tipo de parámetros, nos podemos dar cuenta de que es muy diferente, por eso la trataremos en una sección aparte junto al fwrite que es su contraparte para escritura.

La función fgetc es la más simple de las tres. Esta función lee un caracter a la vez del archivo que esta siendo señalado con el puntero *archivo. En caso de que la lectura sea exitosa devuelve el caracter leído y en caso de que no lo sea o de encontrar el final del archivo devuelve EOF. Esta función se usa generalmente para recorrer archivos de texto. A manera de ejemplo vamos a suponer que tenemos un archivo de texto llamado “prueba.txt” en el mismo directorio en que se encuentra el fuente de nuestro programa. Un pequeño programa que lea ese archivo será:

 #include <stdio.h>
 int main() {
   FILE *archivo;
   char caracter;
   archivo = fopen("prueba.txt","r");
   if (archivo == NULL)
     exit(1);
   printf ("\nEl contenido del archivo de prueba es \n\n");
   while (feof(archivo) == 0){
     caracter = fgetc(archivo);
     printf ("%c",caracter);
   }
   return 0;
 }
 

En este ejemplo lo que vemos ya ha sido explicado excepto por la función feof. Esta función sirve para determinar si el cursor dentro del archivo encontró el final (end of file). Existe otra forma de verificar el final del archivo que es comparar el caracter que trae fgetc del archivo con el macro EOF declarado dentro de stdio.h, pero este método no ofrece la misma seguridad (en especial altratar con los archivos “binarios”). La función feof siempre devolverá 0 si no se encuentra al final del archivo.

Otra cosa importante es que el lenguaje C no tiene dentro de si una estructura para el manejo de excepciones o de errores, por eso es necesario comprobar que el archivo fue abierto con éxito “if (archivo == NULL)“. Si fopen pudo abrir el archivo con éxito devuelve la referencia al archivo (*FILE), de lo contrario devuelve NULL y en este caso se debera revisar la direccion del archivo o los permisos del mismo. En estos ejemplos solo vamos a dar una salida con un retorno de 1 que sirve para señalar que el programa termino por un error.

La otra función de la que hablábamos fue fgets que sirve para el mismo propósito. Existen algunas diferencias por supuesto y podemos empezar con sus tres parámetros. El primer parámetro buffer lo hemos llamado así porque es un puntero a un espacio de memoria del tipo char (podríamos usar un arreglo de char). El segundo parámetro es tamano que es el limite en cantidad de caracteres a leer para la funcion fgets. Y por ultimo el puntero del archivo por supuesto que es la forma en que fgets sabra a que archivo debe escribir.

 #include <stdio.h>
 int main() {
   FILE *archivo;
   char caracteres[100];
   archivo = fopen("prueba.txt","r");
   if (archivo == NULL)
     exit(1); printf ("\nEl contenido del archivo de prueba es \n\n");
   while (feof(archivo) == 0){
     fgets(caracteres,100,archivo);
     printf ("%s",caracteres);
   }
   return 0;
 }

Este es el mismo ejemplo de antes con la diferencia de que este hace uso de fgets en lugar de fgetc. La función fgets se comporta de la siguiente manera, leerá del archivo apuntado por archivo los caracteres que encuentre y a ponerlos en buffer hasta que lea un caracter menos que la cantidad de caracteres especificada en tamano o hasta que encuentre el final de una linea (\n) o hasta que encuentre el final del archivo (EOF). En este ejemplo no vamos a profundizar mas que para decir que caracteres es un buffer, los pormenores seran explicados en la sección de manejo dinámico de memoria.

El beneficio de esta función es que se puede obtener una linea completa a la vez. Y resulta muy útil para algunos fines como la construcción de un parser de algún tipo de archivo de texto.

FREAD, FWRITE Y FCLOSE

Para la lectura de ficheros se utilizará la función fread, la cual sirve para leer contenidos de un fichero.

Su prototipo es el siguiente:

size_t fread (void *data, size_t size, size_t count, FILE *stream);

En estas definiciones se usa el tipo size_t, el cuál está definidio en stddef.h y sirve para definir tamaños de objetos.

Lo que recibe esta función es un puntero donde almacenaremos los datos leídos (comunmente llamado buffer), el tamaño de los datos a leer, la cantidad de esos datos a leer y el apuntador al fichero.

Aquí hay un ejemplo simple para leer los primeros 100 caracteres de un fichero y almacenarlos en un buffer:

 
 
 
 
#include <stdio.h>
 int main ( int argc, char **argv ) {
   FILE *fp;
   char buffer[100];
   fp = fopen ( "fichero.in", "r+" );
   fread ( buffer, sizeof ( char ), 100, fp );
   fclose ( fp );
   return 0;
 }
 

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: