lunes, 1 de junio de 2009

Entrada/Salida binaria

Las funciones bàsicas de E/S gets y putc son capaces de leer y escribir cualquier tipo de fichero (al menos bajo Unix), no sòlo ficheros de texto.

Se puede escribir una "palabra" (tipo de dato entero) sobre un fichero utilizando:

int putw(word, fp)

int word;

FILE *fp;

putw devuelve la palabra escrita en el fichero, o EOF, si se ha producido algún error.

Se puede leer una palabra de un fichero utilizando

int-getw(fp)

FILE *fp;

getw devuelve la palabra, o EOF, si se ha alcanzado el final de fichero antes de leer la totalidad de la palabra. Como EOF es un valor permitido para un int "(pero no para un char), debería utilizarse feof para comprobar la condición de final de fichero después de getw.

Cualquier variable de C puede escribirse como si se tratase de un array de caractores. Por ejemplo, dada la declaraciòn:

union {

long int val;

char c[sizeof long];

} x;

Leyendo o escribiendo el array de caracteres x.c se transferirá exactamente el valor de x.val.

La funciòn general de lectura binaria es fread:

int fwrite(pointer, size, number, fp)

char *pointer;

unsigned int size;

unsigned int number;

FILE *fp;

Esta funciòn lee un nùmero "number" de objetos del fichero "fp", de un tamaño de "size" bytes cada uno de ellos, en el àrea de datos apuntada por "pointer" fread devuelve el número de objetos completos que ha podido leer. Así, cero equivale a un fin de fichero.

La funciòn general de escritura binaria es fwrite

int fread(pointer, size, number, fp)

char *pointer;

unsigned int size;

unsigned int number;

FILE *fp;

que escribe "number" objetos del fichero "fp", de "size" bytes cada uno de ellos, en el àrea apuntada por "pointer" fwrite devuelve el número de objetos completos escritos, que coincidirá con num-ber a menos que se haya producido algún error. Un ejemplo típico de utilización sería:

long int

FILE «írom, *to;

while (f read ( (char *)!

fwriteUchar *)&x, sizeof x, 1, to) ;

copiando un long del fichero "from" al fichero "to".

Es importante observar el empleo del cast &x para obtener un char *. La expresión &(char *)x que fuerza a que "x" sea del tipo char, no funcionaría porque (char)x no es una variable, y no se puede aplicar un &.

Aunque la utilización de fread y fwrite es portable, los ficheros manejados por ellos no tienen porqué serlo, pues estos ficheros son fiel reflejo del tamaño y formato de los objetos de datos representados por el ordenador en cuestión.

Si se necesita escribir ficheros portables es mejor emplear funciones de desplazamiento y máscaras de bits o utilizar datos con formato.

No hay comentarios:

Publicar un comentario