Nov 082017
 
Artículo Lenguaje C

Una de las razones para realizar el desarrollo de una aplicación en lenguaje C en lugar de otros lenguajes como Java o PHP, es la necesidad de obtener el máximo rendimiento de los recursos hardware disponibles.

En este sentido, la entrada/salida de datos a ficheros puede ser un factor importante. En desarrollos que no sean críticos en tiempo de ejecución, es habitual utilizar formatos estructurados como XML o JSON para almacenar los datos. Pero el proceso de conversión hacia y desde estos formatos consume recursos. Para optimizar el rendimiento, podemos optar por almacenar los datos en formato binario, como se explica en este artículo.

Apertura de un fichero de datos binarios

La apertura del fichero se realiza con una llamada a fopen(), pasando como argumentos el nombre del fichero, y un flag “rb” o “wb” según se vaya a abrir el fichero en modo de lectura o de escritura.

La función fopen devuelve un puntero a un descriptor de fichero, que será pasado como argumento a las llamadas que se realicen para acceder a los datos del fichero. Por ejemplo:

Escritura de variables de tipo entero y punto flotante

Para escribir variables integer, float y double en un fichero de datos binario se utiliza la función fwrite, a la que se le pasan como argumentos:

  • Un puntero a la variable a escribir que se puede obtener con el operador “&”.
  • el número de bytes que ocupa la variable. Para obtener este valor, lo más sencillo es utiizar la función sizeof. En el caso de un array, el número de bytes que ocupa cada uno de los elementos del array.
  • El tercer argumento 1 para variables sencillas. Si se está escribiendo un array, es el número de elementos del array.
  • El puntero al descriptor del fichero en donde se van a escribir los datos.

Ejemplo:

Ejemplo de escritura de un array:

Escritura de variables de tipo string

Para escribir una cadena de texto se utiliza una llamada a fwrite() como en el caso de variables de tipo entero, con la diferencia de que en lugar de utilizar “sizeof”, podemos utilizar la función strlen() para obtener el número de bytes a escribir.

Por otra parte, aunque podríamos escribir el carácter “NULL” (0) para marcar el fin de la cadena de texto, puede resultar más conveniente escribir un valor entero precediendo a la cadena de texto, que indique la longitud de la misma.

Ejemplo:

Lectura de los datos de un fichero binario

Para leer los datos contenidos en un fichero binario, abrimos primero el fichero con una llamada a fopen(), con el flag “rb”.

A continuación, utilizamos simplemente la función fread(), que recibe los mismos argumentos que la función fwrite().

Por ejemplo, para leer un número entero:

Para leer un string, si el string está precedido por un valor entero que indica su longitud, podemos utilizar el siguiente código:

Como vemos:

  • Comenzamos leyendo en la variable ‘nbytes’ la longitud del string
  • Mediante una llamada a malloc(), asignamos a la variable ‘texto’ un buffer para contener el string. El tamaño del buffer es nbytes+1, para poder incluir el carácter NULL que marca el fin del string
  • Leemos el texto en la variable ‘texto’
  • Asignamos el caracter NULL al último byte del buffer.

Referencias:

—-

 Publicado por en 9:52 am

 Deja un comentario

(requerido)

(requerido)