Manejo de archivos
15. Acceso Aleatorio.
15.2. Métodos Read and Write
Método Write y read.
Write:
El método write (pertence a ofstream) ,espera recibir un const char * (puntero a una arreglo constante) y en número de n caracteres a insertar.
El puntero a un arreglo constante puede modificarse.. pero NO el contenido del arreglo, por que es constante.
En este caso entiendase que con caracteres se está pensando en que un caracter es un byte, por lo que podemos pensar que escribe una cantidad de bytes.
En ese contexto el tipo de dato que escribo es irrelevante, ya que escribo de a bytes!.
Read:
El método read ( pertence a ifstream) realiza la operación de lectura y espera recibir un char * (puntero a un arreglo) y un número n de bytes y vuelca el contenido de n bytes al puntero pasado como argumento.
En un archivo de texto, fácilmente podemos usar <<, para sacar una variable, pero recordemos que un entero puede tener 1, o mas dígitos, pero desde el punto de vista de bytes, serán normalmente 4 bytes.
Veamos un ejemplo de uso de read y write que el contenido de un archivo y lo copia a otro, en este caso solo los toma como bytes.
Ahora, vamos a mostrar dos archivos que escriben lo mismo: 123456789 en un archivo, pero en un caso vamos a ingresar el número como “ENTERO” y en otro caso como un “ARREGLO DE CHAR” y veremos como cambia el tamaño de los datos a guardar.
ARREGLO DE CHAR
La salida que resulta de ejecutar este programa, será:
Observaciones:
- El archivo tiene un total de 10bytes.
- El archivo es del tipo binario.
ENTERO


Observaciones:
El archivo tiene un total de 4 bytes. Seis bytes menos que el anterior y estamos guardando enmismo nro., esto es un 60 % menos de capacitad para guardar el mismo dato.
El archivo es del tipo binario.
El método write espera recibir un puntero a un arreglo char constante y un puntero a un arreglo de char para el caso de read, por lo que debemos acondicionar lo que tenemos como arguemento.

write: debemos pasarle un puntero a un arreglo constante, pero tenemos un entero, por lo que obtenemos la direción del entero y le hacemos un casting explicito a const char, para lograr el argumento que necesita write (puntero a un arreglo constante).
En algunos casos se paso un puntero del tipo char* (no const), y es perfectamente válido pasarlo al método write que espera const char*, porque eso solo garantiza que el método no lo va a modificar. Es una conversión implícita válida.
out.write ((const char*)&x, sizeof (int));
in.read ((char*)&x, sizeof (int));