Manejo de archivos

13. Acceso Aleatorio.

13.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 a lo que apunta.

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

Veamos ahora como sería el caso de guardar el mismo nro. pero como entero


La salida que resulta de ejecutar este programa, será:


Observaciones:

El archivo tiene un total de 4 bytes. Seis bytes menos que el anterior y estamos guardando en
mismo nro., esto es un 60 % menos de capacitad para guardar el mismo dato.
El archivo es del tipo binario.

Hay un par de cosas que tenemos que aclarar, sobre el primer argumento del método write y read.
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.


Vemos que en el primer caso el nombre del arreglo ya es un puntero a un arreglo del tipo char, en este caso write y read no necesitan mayores modificaciones del argumento.
Para el segundo caso, como el nro. que se tiene es un entero, para el caso de :

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.


out.write ((const char*)&x, sizeof (int));

read: debemos pasar un puntero a un arreglo de char , hacemos entonces un cast explicito.

in.read ((char*)&x, sizeof (int));