modificar un registro con fwrite

Iniciado por neo_from_cs_matrix, 28 Julio 2011, 00:00 AM

0 Miembros y 1 Visitante están viendo este tema.

neo_from_cs_matrix

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( &reg, 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

     ;)


naderST

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.

Beakman

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.

do-while

¡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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!