amigos quisiera saber si este procedimiento es correcto
dado un struct cualquiera
struct fecha
{
int dia,mes,anyo;
};
void modificar_registro(struct fecha reg, int pos)
{
FILE* p=fopen("fechas.dat","rb+")
fseek(p, sizeof reg * pos, 0);
fwrite( ®, sizeof reg, 1, p);
fclose(p);
}
int main()
{
struct fecha vFechas[10];
// vFechas = X; // se inicialisa de alguna forma, no importa
// le paso la posicion 5 que es un registro dentro del vector.
// el registro 5 es el que se supone que se quiera modificar
modificar_registro(vFechas[5], 5);
return 0;
}
lo que quiero saber es si la funcion de modificar_registro funcionaria de esa manera?, si esta mal quisiera saber como seria esto
;)
Parece estar bien, lo único que veo es que abres el archivo en modo lectura y deberías abrirlo en modo de escritura 'wb' o 'ab' te vendría mejor en tu caso para que no se borre el contenido del archivo.
CitarParece estar bien, lo único que veo es que abres el archivo en modo lectura y deberías abrirlo en modo de escritura 'wb' o 'ab' te vendría mejor en tu caso para que no se borre el contenido del archivo.
Fijate que puso "rb+", osea también puede escribir en el archivo.
Está bien lo que hacés, presta atención no más que cuando haces esto:
modificar_registro(vFechas[5], 5);
El valor de vFechas[ 5 ] tiene que ser el NUEVO valor a ingresar, no el dato a borrar. Si es así, está bien.
¡Buenas!
En lugar de depender de un tipo de dato en concreto, puedes hacer una funcion mas general, por ejemplo:
size_t fposwrite(unsigned long pos , void* dato_ptr , size_t tam_dato , size_t nrep , FILE* f)
{
fseek(f , pos * tam_dato , SEEK_SET);
return fwrite(dato_ptr , tam_dato , nrep , f);
}
//ejemplo de llamada
fposwrite(5 , &vFechas[5] , sizeof(struct fecha) , 1 , p);
Y para la lectura lo mismo:
size_t fposread(unsigned long pos , void* dato_ptr , size_t tam_dato , size_t nrep , FILE* f)
{
fseek(f , pos * tam_dato , SEEK_SET);
return fread(dato_ptr , tam_dato , nrep , f);
}
//ejemplo de llamada
fposread(3 , &vFechas[3] , sizeof(struct fecha) , 1 , p);
Al utilizar punteros a void y la similitud con las llamadas a fwrite y fread, haces que el codigo sea mas general e intuitivo, y te olvidas de declarar funciones de lectura y escritura para cada tipo de dato que crees. Eso si, tendras que abrir el fichero en el modo correcto antes de realizar cualquier llamada a alguna de estas funciones (como lo harias con cualquier otro fichero y las operaciones de stdio) y luego cerrarlo. XD
¡Saludos!
muy bueno muchachos