archivos de registros

4

Click here to load reader

Upload: javier-rivera

Post on 13-Jun-2015

6.641 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Archivos de Registros

ARCHIVOS DE REGISTROS

Podemos entender archivos binarios, como archivos de registros o archivos de longitud fija, existen algunas leves diferencias entre estos tres conceptos pero en esencia hay muchas similitudes y coincidencias, sin embargo nos referiremos a archivos de registros.

Si hablamos de archivos de registros entonces estaremos almacenando en cada linea de archivo, registros cuya información tenga una estructura igual en cada linea. Observemos la figura

Posición Nombre Apellido Edad

0 Antonia Perez 50 <== 1ra linea/fila o registro

1 Carlos Monsalve 44 <== 2da linea/fila o registro

2 Mariana Urdaneta 18 <== 3ra linea/fila o registro

Veamos un ejercicio en C++ donde se almacenan varios registros definidos con la sentencia struct para organizar los datos.

Definimos la estructura de la siguiente manera

typedef struct {char Nombre[20];char Apellido[20];int Edad;

} datos_persona;

Podemos asignar valores solicitándolos al usuario cuando ejecutemos el programa o asignar valores de prueba directamente en el código para fines prácticos como lo hacemos a continuación ..

datos_persona persona;

persona.Nombre = “Antonia”;persona.Apellido = “Perez”;persona.Edad = 50;

o así

datos_persona persona;

persona = {“Antonia”,”Perez”,50};

También podríamos declarar un arreglo de varios elementos y asignar valores de la siguiente forma ..

datos_persona Vpersonas[3]; // colocamos V de Vector como prefijo al identificador del arreglo

Vpersonas = {{“Antonia”,”Perez”,50},{“Carlos”,”Monsalve”,44},{“Mariana”,”Urdaneta”,18}};

Entrando de nuevo en materia de archivos, sabemos que si queremos almacenar datos en un archivo de

Page 2: Archivos de Registros

registros debemos indicarle tal instrucción en el programa al momento de aperturarlo. Veamos como hacerlo:

FILE *fichero;

fichero = fopen(“datos_personas.dat”,”wb”); // <= wb significa de escritura (crearlo) y binarioif (fichero == NULL) { cout << “Error: No puede abrir el archivo”; return -1}

Una vez que el archivo se encuentra creado y abierto, podemos ahora ingresar o copiar datos dentro del archivo, podemos hacerlos con la sentencia fwrite(), que me permite copiar uno o varios registros de una vez, veamos como:

Si deseamos copiar un solo registro, lo haremos de la siguiente manera,

fwrite (persona, sizeof(datos_persona), 1, fichero);

El orden de los parámetros es el siguiente, primero colocamos la variable donde están los datos que deseamos almacenar, luego el tamaño del registro en bytes (esto lo conseguimos con la función sizeof(tipodedato)), seguimos con la cantidad de registros a almacenar y por ultimo el identificador del archivo donde deseamos almacenar la información.

Ahora, si deseamos copiar varios registros (y lo tenemos almacenado en un arreglo), lo haremos de la siguiente manera.

fwrite (Vpersonas, sizeof(datos_persona), 3, fichero);

Observe que el primer parámetro es una arreglo, el tamaño del registro sigue siendo el mismo, el número de registros son los almacenados en el arreglo (en este caso 3) y por supuesto el último es el identificador del archivo.

Ahora solo quedaría cerrar el archivo y con otro ejercicio podemos consultar los datos para verificar su almacenamiento.

Nuestro código final quería así ..

int main() {

typedef struct {char Nombre[20];char Apellido[20];int Edad;

} datos_persona;

datos_persona Vpersonas[3]; Vpersonas = {{“Antonia”,”Perez”,50},{“Carlos”,”Monsalve”,44},{“Mariana”,”Urdaneta”,18}};

Page 3: Archivos de Registros

FILE *fichero;

fichero = fopen(“datos_personas.dat”,”wb”); // <= wb significa de escritura (creado) y binario if (fichero == NULL) {

cout << “Error: No puede abrir el archivo”; return -1 }

fwrite (Vpersonas, sizeof(datos_persona), 3, fichero);

fclose(fichero);}

Ahora vamos a ver como hacer para leer nuestro archivo de registros.

Al tener un archivo de registros y no de lineas de texto, tenemos la ventaja que todas las filas o lineas del archivo tienen la misma longitud, es por ello que también lo llamamos archivos de longitud fija o registro fijo. Esto nos permitirá ir directamente a leer cualquier registro del archivo sin tener que leer y pasar previamente por las lineas anteriores (algo parecido a los arreglos), para ello haremos uso de las funciones: fseek() y ftell()

fseek() nos permitirá situar el cursor del archivo en cualquier línea (o fila) del mismo, así podremos acceder la información del registro almacenada en la posición indicada, para ubicar el cursor en una linea determinada debemos conocer el tamaño del registro y multiplicarlo por la cantidad de líneas (o filas) que deseamos desplazar. Este desplazamiento lo podemos realizar desde el inicio del archivo, el fin de archivo o la posición actual del curso, el mismo será indicado por parámetro a la función.

Si deseamos ubicar el cursor del archivo en la 3da linea (la que se encuentra en la posición 2) podriamos ejecutar la siguiente instrucción:

Posición Nombre Apellido Edad

0 Antonia Perez 50 <== 1ra linea/fila o registro

1 Carlos Monsalve 44 <== 2da linea/fila o registro

Cursor => 2 Mariana Urdaneta 18 <== 3ra linea/fila o registro

3 Luisa Perales 14 <== 4ta linea/fila o registro

// Realiza el desplazamiento desde el inicio del archivofseek (fichero, 2*sizeof(datos_persona), SEEK_SET);

La función ftell() nos permitirá conocer la posición en bytes donde se encuentra el cursos del archivo, el cual al ser dividido por el tamaño del registro nos indica el número de la linea donde se encuentra el cursor dentro del archivo.

La función de lectura de un archivo de registros a utilizar será fread, la cual nos permite leer uno o varios registros desde la posición donde este ubicado el cursor del archivo y al igual que fwrite,

Page 4: Archivos de Registros

requiere que sea enviado por parámetro el tamaño del registro y número de registros a leer, que serán almacenados en la variable indicada como primer parámetro. Veamos como:

fread (&persona, sizeof(datos_persona), 1, fichero);

Veamos un código donde leemos y mostramos por pantalla todas la filas de un archivo de registros.

int main() {

typedef struct {char Nombre[20];char Apellido[20];int Edad;

} datos_persona;

datos_persona personas; FILE *fichero;

fichero = fopen(“datos_personas.dat”,”rb”); if (fichero == NULL) {

cout << “Error: No puede abrir el archivo”; return -a; }

int pos = 0; int reg_leidos; while (!feof(fichero)) { fseek (fichero, pos * sizeof(datos_persona) , SEEK_SET);

reg_leidos = fread (&persona, sizeof(datos_persona), 1, fichero); if (reg_leidos == 0) break;

cout << “Nombre y Apellido : ” << persona.Nombre << “, ” << persona.Apellido << endl; cout << “Edad : ” << persona.Edad; pos = pos +1; }

fclose(fichero);}

Ejercicios:

1) Hacer un programa que escriba los registros del archivo al revés desde el último hasta el primero.2) Hacer una función que me diga cuantos registros tiene una archivo binario de registro fijo.3) Hacer un programa que dado el archivo del ejemplo de la guía me permita buscar la edad de una persona dado su nombre y apellido (no cargar el archivo en un vector)4) Hacer un programa que permita realizar el ejercicio 3) con búsqueda binaria.