Consultas, desarrollo de programas y petición de presupuestos:

jueves, 12 de julio de 2012

Ficheros (II) y tipos de datos definidos por el usuario

Lectura y escritura de bloques de datos: Manejo de registros de longitud fija
Estos son los mas habituales de usar
int fwrite (const void *datos,int tamaño,int cantidad,FILE *punteroFichero)
int fread(const void *datos, int tamaño, int cantidad, FILE *punteroFichero)
Escribe/Lee en un fichero, pero escriben bloques de datos por ejemplo un record,es un bloque de datos, ya que guarda un valor (un entero, 2 bytes) de y el nombre (14+/0=15 caracteres por ejemplo), el tamaño seria 17, y la cantidad seria cuantos records vamos a gravar (podemos ir uno a uno)
Depende de la forma de abrir el archivo, leera al principio, final, etc..

La posicion actual por donde vamos leyendo o escribiendo: (ni al principio ni al final)
La funcion fseek, cambiamos la posición actual del fichero
int fseek(FILE *punteroFichero,long desplazamiento,int origen)

long desplazamiento= enteros largos, ya que los archivos son muy grandes y no vale int

ejemplo:1 º lectura con fread













Pepito
12


Manolito
31


ejemplo:2 º lectura con fread


Juan
32


Ana
23


Pepito
12

Manolito
31

Para modificar un registro, con fseek, me posiciono donde quiero ponerme, lo que ocurre es que cuando lee un registro, pasa al anterior...¿como me posiciono donde quiero?
1) Forma:
Origen: seek-set: desde el principio
seek-cur: desde la posicion actual → tendriamos que retroceder 17: se pone -17L
seek-end: desde el fInal

fseek(FILE *pf,-17L,SEEK-CUR) , ahora me posiciono en Pepito 12

L=indica que es long (o podemos poner una variable tipo Long)

2) Forma
Tambien lo podemos hacer saltando desde el principio, sabiendo que pedrito, es el 3:

fseek(FILE pf,2*17L,SEEK-SET)


¿donde estoy en el fichero?
Si te olvidas de donde estas en el fichero, hay una funcion que devuelve el desplazamiento contando desde el principio del ficero
long ftell(FILE *punteroFichero), te da la posicion actual del fichero.

Nota Importante:
En los ficheros de lectura y escritura, solo se maneja una posición independientemente si se usa para lectura o escritura.

Si cambias de lectura a escritura o al reves, tienes que usar un fseek (según convenio ANSI C)


El concepto de Registro/Estructuras:

Son tipos de datos complejos, es decir tipos de datos que me fabrico a partir de datos simples o de otras estructuras.

Tipos de datos simples que tenemos:
char
int
long
float
double

Por ejemplo: quiero guardar un registro, que este compuesto por una cadena de caracteres y un numero (para el programa tabla de record).

typedef struct  {
//Indican los tipos y variables que conforman la estructuras
}nombre;
Ejemplo: (no poner record, ya que puede ser una palabra reservada, y que nos dara problemas..., mejor poner nombres en castellano). Me invento un tipo de dato con typedef:

typedef struct {
char nombre[15]; // 14+\0
int intentos;
}puntuacion;

Crear una variable:
(tipo de dato) (nombre_de_la_variable)
puntuacion tablaRecords[10]; // tabla de datos


Las definiciones de tipos de datos nuevos deben de estar por encima del main (o por ejemplo en el fichero: main.h)

Para crear un solo registro:
puntuacion actual ; //crea un registro
Manujar una variable (dentro de la estructura):
actual.intentos++;

Para determinar la longitud del tipo de dato, podemos usar sizeof(tipo de dato):

sizeof(puntuacion)

Uso de fwrite: (para escribir la tabla de 10 elementos de TablaRecords a la vez)
fwrite (TablaRecords,sizeof(puntuacion),10,pF)
si escriber solo uno:
fwrite (TablaRecords[contador],sizeof(puntuacion),1,pF)

Y para leer es:
fread (TablaRecords,sizeof(puntuacion),10,pF)


No hay comentarios:

Publicar un comentario