facebook cdr twitter cdr   instagram cdr
Miércoles, 28 March 2018 15:17

13. Archivos

Escrito por
Valora este artículo
(1 Voto)

13.1 Archivos

El estándar de C contiene varias funciones para la edición de ficheros, éstas 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:

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

files

13.2 Funciones principales

13.2.1 fopen()

Esta función sirve para abrir y crear ficheros en disco. El prototipo correspondiente de fopen es:

cap52

Los parámetros de entrada de fopen son:

  • filename: Una cadena que contiene un nombre de fichero válido.
  • opentype: Especifica el tipo de fichero que se abrirá o se creará.

Una lista de parámetros opentype para la función fopen son:

  • "r" : Abrir un archivo para lectura, el fichero debe existir.
  • "w" : Abrir un archivo para escritura, se crea si no existe o se sobreescribe si existe.
  • "a" : Abrir un archivo para escritura al final del contenido, si no existe se crea.
  • "a+": Abrir un archivo para escritura al final del contenido, sin sobreescribir el contenido existente.
  • "r+" : Abrir un archivo para lectura y escritura, el fichero debe existir.
  • "w+" : Crear un archivo para lectura y escritura, se crea si no existe o se sobreescribe si existe.
  • "r+b ó rb+" : Abre un archivo en modo binario para actualización (lectura y escritura).
  • "rb" : Abre un archivo en modo binario para lectura.

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.

13.2.2 fclose()

Esta función sirve para poder cerrar un fichero que se ha abierto. El prototipo correspondiente de fclose es:

cap53

Un valor de retorno indica que el fichero ha sido correctamente cerrado, si ha habido algún error, el valor de retorno es la constante EOF. Un ejemplo pequeño para abrir y cerrar el archivo llamado fichero.in en modo lectura:

cap54

Como vemos, en el ejemplo se utilizó el opentype "r", que es para la lectura.

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 (fp == 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.

13.2.3 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 al tratar con los archivos "binarios"). La función feof siempre devolverá 0 (Falso) si no es encontrado EOF en el archivo, de lo contrario regresará un valor distinto de 0 (Verdadero).

El prototipo correspondiente de feof es:

cap55

13.2.4 rewind()

Literalmente significa "rebobinar", sitúa el cursor de lectura/escritura al principio del archivo. El prototipo correspondiente de rewind es:

cap56

13.3 Lectura

Un archivo generalmente 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:

  • char fgetc(FILE *archivo)
  • char *fgets(char *buffer, int tamano, FILE *archivo)
  • size_t fread(void *puntero, size_t tamano, size_t cantidad, FILE *archivo);
  • int fscanf(FILE *fichero, const char *formato, argumento, ...);

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 aparte junto al fwrite que es su contraparte para escritura.

13.3.1 fgetc()

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.

El prototipo correspondiente de fgetc es:

cap57

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á:

cap58

13.3.2 fgets()

Esta función está diseñada para leer cadenas de caracteres. Leerá hasta n-1 caracteres o hasta que lea un cambio de línea '\n' o un final de archivo EOF. En este último caso, el carácter de cambio de línea '\n' también es leído. El prototipo correspondiente de fgets es:

cap59

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 tamaño 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 leer.

cap60

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 tamaño 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.

13.3.3 fread()

cap61

Esta función lee un bloque de una "stream" de datos. Efectúa la lectura de un arreglo de elementos "count", cada uno de los cuales tiene un tamaño definido por "size". Luego los guarda en el bloque de memoria especificado por "ptr". El indicador de posición de la cadena de caracteres avanza hasta leer la totalidad de bytes. Si esto es exitoso la cantidad de bytes leídos es (size*count).

PARAMETROS:

  • ptr: Puntero a un bloque de memoria con un tamaño mínimo de (size*count) bytes.
  • size: Tamaño en bytes de cada elemento (de los que va a leer).
  • count: Número de elementos, los cuales tienen un tamaño "size".
  • stream: Puntero a objetos FILE, que especifica la cadena de entrada.

13.3.4 fscanf()

La función fscanf funciona igual que scanf en cuanto a parámetros, pero la entrada se toma de un fichero en lugar del teclado. El prototipo correspondiente de fscanf es:

cap62

Podemos ver un ejemplo de su uso, abrimos el documento "fichero.txt" en modo lectura y leyendo dentro de el.

cap63

 

13.4 Escritura

Así como podemos leer datos desde un fichero, también se pueden crear y escribir ficheros con la información que deseamos almacenar, Para trabajar con los archivos existen diferentes formas y diferentes funciones. Las funciones que podríamos usar para escribir dentro de un archivo son:

  • int fputc(int caracter, FILE *archivo)
  • int fputs(const char *buffer, FILE *archivo)
  • size_t fwrite(void *puntero, size_t tamano, size_t cantidad, FILE *archivo);
  • int fprintf(FILE *archivo, const char *formato, argumento, ...);

13.4.1 fputc()

Esta función escribe un carácter a la vez del archivo que esta siendo señalado con el puntero *archivo. El valor de retorno es el carácter escrito, si la operación fue completada con éxito, en caso contrario será EOF. El prototipo correspondiente de fputc es:

cap64

Mostramos un ejemplo del uso de fputc en un "fichero.txt", se escribira dentro del fichero hasta que presionemos la tecla enter.

cap65

13.4.2 fputs()

La función fputs escribe una cadena en un fichero. La ejecución de la misma no añade el carácter de retorno de línea ni el carácter nulo final. El valor de retorno es un número no negativo o EOF en caso de error. Los parámetros de entrada son la cadena a escribir y un puntero a la estructura FILE del fichero donde se realizará la escritura.

El prototipo correspondiente de fputs es:

cap66

Para ver su funcionamiento mostramos el siguiente ejemplo:

cap67

13.4.3 fwrite()

Esta función está pensada para trabajar con registros de longitud constante y forma pareja con fread. Es capaz de escribir hacia un fichero uno o varios registros de la misma longitud almacenados a partir de una dirección de memoria determinada. El valor de retorno es el número de registros escritos, no el número de bytes. Los parámetros son: un puntero a la zona de memoria de donde se obtendrán los datos a escribir, el tamaño de cada registro, el número de registros a escribir y un puntero a la estructura FILE del fichero al que se hará la escritura.

El prototipo correspondiente de fwrite es:

cap68

Un ejemplo concreto del uso de fwrite con su contraparte fread y usando funciones es:

cap69

13.4.4 fprintf()

La función fprintf funciona igual que printf en cuanto a parámetros, pero la salida se dirige a un archivo en lugar de a la pantalla. El prototipo correspondiente de fprintf es:

cap70

Podemos ver un ejemplo de su uso, abrimos el documento "fichero.txt" en modo lectura/escritura y escribimos dentro de él.

cap71

 

Visto 70 veces Modificado por última vez en Miércoles, 04 April 2018 16:28
Alejandro Carreño

Desarrollador, Programador, Web Master y Community Manager de CDR Consultores

Deja un comentario

Asegúrese de introducir toda la información requerida, indicada por un asterisco (*). No se permite código HTML.

Tweets

RT @cdrconsultores: Descubre aquí los consejos para evitar errores de gestión empresarial -> https://t.co/sXjnWiVsYR https://t.co/RfDxmfZhbx
Descubre aquí los consejos para evitar errores de gestión empresarial -> https://t.co/sXjnWiVsYR https://t.co/RfDxmfZhbx

Productos

Servicios

servicios off
website off
desarrollo off
formacion off
negocios off

Publicaciones

« Abril 2018 »
Lun Mar Mier Jue Vie Sáb Dom
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

Facebook

end-logo

 

Nestor M. Carreño T. - Todos los Derechos Reservados
Rescindir de Dios y de los valores morales, lleva no sólo al empobrecimiento espiritual, sino también al empobrecimiento material
Gracias a Usted, Muchas Gracias por Consultarnos, Dios le Bendiga!

Diseño y Desarrollo Nestor M. Carreño T. - CDR Consultores, C.A.