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