Manejo de archivos
13. Acceso Aleatorio.
13.1. Lectura, Escritura Aleatoria
Introducción a Métodos de lectura y escritura en Archivos de acceso aleatorio. Antes de avanzar con las funciones que permiten escribir y leer vamos a recordar algo de
punteros.
Puntero y const
- Los punteros son variables que guardan una dirección de memoria.
- Los punteros son variables especiales por no tener sólo un valor (dirección de memoria), pero también tienen asociado el valor a que apuntan: tipo de la variable.
- Como cualquier variable su valor puede ser constante o no.
- La palabra clave const declara que un valor no es modificable por el programa.
- No puede hacerse ninguna asignación posterior a un identificador especificado como const , tira Error!
const char
El tipo “const char” es una constante char y el valor no puede ser cambiado por lo tanto SIEMPRE debe tener un valor al inicializar, ya que luego no se puede modificar, mientras que una variable , si puede ser cambiado.
Veamos unos ejemplos con const:
Puntero Constante a cadena de Carateres.
Regla práctica : Lo que está a la izquierda de const vale. Si no hay nada a la izquierda, vale lo que está a la derecha.
Vamos a tratar de entender que es esta declaración:
char * const pt1;
Miramos a la izquierda de const.
char * const pt1;
^^^^^
Vemos * => puntero.
char * const pt1;
^
Se debe interpretar como : puntero constante
Seguimos hacia la izquierda vemos char :
char * const pt1;
^^^^
Resultado:
pt1 es un puntero constante a char
- Puedo cambiar el contenido de lo apuntado, el char NO es constante.
- NO puedo modificar el puntero , el puntero si es constante.
char texto[] = "Sol";
char * const pt1 = texto;
cout << *pt1 << endl; // S
pt1[0] = 'T'; // OK
// pt1++; // ERROR No puedo cambiar una constante
Puntero a cadena de caracteres constante
Regla práctica : Lo que está a la izquierda de const vale. Si no hay nada a la izquierda, vale lo que está a la derecha.
Vamos a tratar de entender que es esta declaración:
const char * pt2;
Miramos a la izquierda de const y no hay nada
const char * pt2;
Pero a la derecha está const está char: caracteres constantes.
Seguimos leyendo:
const char * pt2;
^
Vemos: * o puntero!
→ puntero a caracteres constantes.
Resultado:
pt2 es un puntero a caracteres constantes.
- Puedo cambiar el puntero.
-
NO puedo modificar el contenido apuntado, por que es constante.
char texto1[] = "Sol"; //cadena de caracteres
char texto2[] = "Luna"; //otra cadena de caracteres
const char * pt2 = texto1; //puntero o cadena constante de caracters
cout << *pt2 << endl; // muestra S
pt2 = texto2; // OK, puedo cambiar el puntero
cout << *pt2 << endl; // muestra L
// pt2[0] = 'M'; // ERROR , no puedo cambiar el contenido, es constante
// *pt2 = 'M'; // ERROR , no puedo cambiar el contenido, es constante
Sobre el nombre de un arreglo.
El nombre de un arreglo se comporta de manera similar a un puntero constante: puede usarse para acceder a los elementos, pero no puede hacerse que apunte a otro lugar.
char texto[] = "Sol"; //arreglo de caracteres, texto es un puntero al 1er caracter
char * const p = texto; //p apunta al primer caracter, por que texto apuntaba al 1er caracter.
// a la izquierda de const está * , por lo tanto p es un puntero constante, NO se puede modificar.
// Ambos permiten:
cout << texto[0]; // muestro el contenido , mostraría S
cout << p[0]; //muestro el contenido , mostraría S
// Ninguno permite:
texto++; // ERROR , el nombre del arreglo se comporta como un puntero constante.
p++; // ERROR (porque p es const)
¿entonces por qué no es un puntero constante?
Porque su tipo real es diferente.
char texto[] = "Sol";
char * const p = texto;
Tipos:
texto --> char[4]
p --> char * const
Uno es un arreglo y el otro es un puntero. El compilador los trata de manera distinta.
Por ejemplo , sizeof(texto) devuelve: 4 , porque mide el tamaño completo del arreglo.
Mientras que sizeof(p) en una máquina de 64 bits suele devolver: 8 , porque mide el tamaño del puntero.
Notat que sería la mismo declarar :
- const char * : puntero a caracter constante.
- char const * : puntero a caracter constante.
Según la regla práctica , ambas declaraciones sería no mismo.
Se suele recomendar escribir “const char *” para favorecer la comprensión . Así, cuando leés “const char *”, entendés de inmediato que los caracteres son constantes. En resumen, la forma más clara y menos propensa a confusiones es colocar “const” justo al lado del elemento que querés proteger: char. E
Código para analizar por parte del alumno
Se deja al alumno pensar observar el siguiente código y justificar :
- que tipo de dato es pt1?
- que tipo de dato es pt2?
- por que pt1++ tiraría error?
