Como modificar un fichero
Buenas, tengo una duda y esque no se como modificar un registro en un fichero. Se q primero tengo que leer los datos y almacenarlos en variables y despues de modificarlos introducirlos de nuevo en el fichero pero no entiendo muy bien la funcion fseek y ftell asique si pudierais ayudarme os lo agradeceria.
Gracias.
Gracias.
Supon que tu registro se llama Registro.
La funcion sizeof(Registro) te da el tamaño en bytes de ese registro. Supon que haces
int N = sizeof(Registro); // En N guardamos el tamaño
Las posiciones en bytes donde empiezan los registros en el fichero son 0, N, 2*N, 3*N, etc, es decir, el número de registro por N.
fseek() te coloca en una determinada posición del fichero. Debes dar el tamaño en bytes. Asi, por ejemplo, si quieres ir al registro 10 y el primer registro es el 0, tienes que hacer
fseek(fichero, 10*N, SEEK_SET);
fichero es el descriptor de fichero, 10*N es la posición en bytes del registro número 10 (el primero es el número 0) y SEEK_SET es una constante que ya está definida en el include (puede tener otros valores como SEEK_END o SEEK_CUR, pero para lo que quieres te vale con SEEK_SET).
Una vez hecho eso, si escribes o lees, lo harás sobre el registro numero 10.
En cuanto a ftell(), te da el tamaño en bytes del fichero. Si lo divides por N, sabrás el número de registros que hay en el fichero.
int numero_registros = ftell() / N;
Se bueno.
La funcion sizeof(Registro) te da el tamaño en bytes de ese registro. Supon que haces
int N = sizeof(Registro); // En N guardamos el tamaño
Las posiciones en bytes donde empiezan los registros en el fichero son 0, N, 2*N, 3*N, etc, es decir, el número de registro por N.
fseek() te coloca en una determinada posición del fichero. Debes dar el tamaño en bytes. Asi, por ejemplo, si quieres ir al registro 10 y el primer registro es el 0, tienes que hacer
fseek(fichero, 10*N, SEEK_SET);
fichero es el descriptor de fichero, 10*N es la posición en bytes del registro número 10 (el primero es el número 0) y SEEK_SET es una constante que ya está definida en el include (puede tener otros valores como SEEK_END o SEEK_CUR, pero para lo que quieres te vale con SEEK_SET).
Una vez hecho eso, si escribes o lees, lo harás sobre el registro numero 10.
En cuanto a ftell(), te da el tamaño en bytes del fichero. Si lo divides por N, sabrás el número de registros que hay en el fichero.
int numero_registros = ftell() / N;
Se bueno.
he intentado hacer lo q me dijiste sobre el fseek etc.. pero sigue sin salirme, este es el codigo q tengo puesto:
void Asignar_Operario_A_Averia (int cod_ope_libre) {
FILE *f_orden_mio;
Reg_personal reg_per;
char fichero_orden_mio [] ="orden_mio.txt";
int numreg;
numreg=(cod_ope_libre)*sizeof(reg_per);
printf ("%dn", numreg);
if ((f_orden_mio=fopen("orden_mio.txt","r+b"))!=NULL) {
if (fread(®_per,sizeof(reg_per),1,f_orden_mio)==1) {
//while (!feof(f_orden_mio)) {
fseek(f_orden_mio,numreg,SEEK_SET);
reg_per.cod_personal=11;
fwrite(®_per,sizeof(reg_per),1,f_orden_mio);
fread (®_per,sizeof(reg_per),1,f_orden_mio);
}
fclose(f_orden_mio);
} else {
printf ("ERROR: El fichero %s no puede abrirse para lecturan", fichero_orden_mio);
}
}
cod_ope_libre se lo paso a la funcion y es el registro numero 3 en el fichero orden_mio.txt y lo que quiero es cambiar ese 3 por un 11, a ver si me dices como hacerlo.
Gracias.
void Asignar_Operario_A_Averia (int cod_ope_libre) {
FILE *f_orden_mio;
Reg_personal reg_per;
char fichero_orden_mio [] ="orden_mio.txt";
int numreg;
numreg=(cod_ope_libre)*sizeof(reg_per);
printf ("%dn", numreg);
if ((f_orden_mio=fopen("orden_mio.txt","r+b"))!=NULL) {
if (fread(®_per,sizeof(reg_per),1,f_orden_mio)==1) {
//while (!feof(f_orden_mio)) {
fseek(f_orden_mio,numreg,SEEK_SET);
reg_per.cod_personal=11;
fwrite(®_per,sizeof(reg_per),1,f_orden_mio);
fread (®_per,sizeof(reg_per),1,f_orden_mio);
}
fclose(f_orden_mio);
} else {
printf ("ERROR: El fichero %s no puede abrirse para lecturan", fichero_orden_mio);
}
}
cod_ope_libre se lo paso a la funcion y es el registro numero 3 en el fichero orden_mio.txt y lo que quiero es cambiar ese 3 por un 11, a ver si me dices como hacerlo.
Gracias.
