Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: neo_from_cs_matrix en 28 Julio 2011, 00:00 am



Título: modificar un registro con fwrite
Publicado por: neo_from_cs_matrix en 28 Julio 2011, 00:00 am
amigos quisiera saber si este procedimiento es correcto

dado un struct cualquiera

Código:
struct fecha
{
    int dia,mes,anyo;
};
Código:
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);
}

Código:
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

      ;)



Título: Re: modificar un registro con fwrite
Publicado por: naderST en 28 Julio 2011, 00:26 am
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.


Título: Re: modificar un registro con fwrite
Publicado por: Beakman en 28 Julio 2011, 02:40 am
Citar
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.

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:
Código
  1. 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.


Título: Re: modificar un registro con fwrite
Publicado por: do-while en 28 Julio 2011, 11:17 am
¡Buenas!

En lugar de depender de un tipo de dato en concreto, puedes hacer una funcion mas general, por ejemplo:

Código
  1.  
  2. size_t fposwrite(unsigned long pos , void* dato_ptr , size_t tam_dato , size_t nrep , FILE* f)
  3. {
  4.    fseek(f , pos * tam_dato , SEEK_SET);
  5.    return fwrite(dato_ptr , tam_dato , nrep , f);
  6. }
  7.  
  8. //ejemplo de llamada
  9. fposwrite(5 , &vFechas[5] , sizeof(struct fecha) , 1 , p);
  10.  
  11.  

Y para la lectura lo mismo:

Código
  1.  
  2. size_t fposread(unsigned long pos , void* dato_ptr , size_t tam_dato , size_t nrep , FILE* f)
  3. {
  4.    fseek(f , pos * tam_dato , SEEK_SET);
  5.    return fread(dato_ptr , tam_dato , nrep , f);
  6. }
  7.  
  8. //ejemplo de llamada
  9. fposread(3 , &vFechas[3] , sizeof(struct fecha) , 1 , p);
  10.  
  11.  

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!


Título: Re: modificar un registro con fwrite
Publicado por: neo_from_cs_matrix en 29 Julio 2011, 22:44 pm
muy bueno muchachos