Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Torino10 en 13 Mayo 2012, 06:18 am



Título: Manejo de archivos en C. Borrar registro
Publicado por: Torino10 en 13 Mayo 2012, 06:18 am
Hola como están!

Les hago una consulta.
Resulta que tengo un archivo en donde guardo datos de una estructura.
Estoy creando una funcion para poder "borrar" los registros que voy guardando de acuerdo a un codigo que me es ingresado por el usuario.

Tengo un miembro en la estructura al que llamo "borrado", de tipo char el cual toma los valores "s" o "n" dependiendo de como se encuentre.

En la funcion despues de realizar la busqueda, encuentro el registro y muestro los datos que trae en pantalla.

La duda es como cambiar el valor de solo ese mientro a "s" para indicar que fue borrado.

Dejo un fragmento del codigo para mostrar como lo estoy haciendo.

Código
  1. FILE *archivo;
  2. struct personas persona;
  3.  
  4. archivo=fopen("personas.txt", "rb+");
  5.  
  6. fseek(archivo, sizeof(struct personas)*(buscarpersona(archivo, codigo)-1), 0);
  7. //La funcion buscar persona me devuelve el registro buscado, resto uno para posicionarme y despues "borrar"
  8. fread(&persona, sizeof(struct personas), 1, archivo);
  9.  
  10. strcpy(persona.borrado, "s");
  11.  
  12. fwrite(&persona, sizeof(struct personas), 1, archivo);
  13. fclose(archivo);          
  14.  

Espero que me puedan tirar unas ideas. Saludos y gracias!


Título: Re: Manejo de archivos en C. Borrar registro
Publicado por: satu en 13 Mayo 2012, 13:53 pm
Hola

Al ser un char no necesitas strcpy, eso es para char*. Utiliza la asignación normal:
persona.borrado = 's';

Saludos


Título: Re: Manejo de archivos en C. Borrar registro
Publicado por: durasno en 13 Mayo 2012, 17:14 pm
Hola! es como dice satu si vas a usar un char pone 's'.. Ademas despues de actualizar ese dato, antes de volver a escribir en el archivo tenes q volver  a posicionar el cursor, sino estarias guardando mal
Código
  1. FILE *archivo;
  2. struct personas persona;
  3.  
  4. archivo=fopen("personas.txt", "rb+");
  5.  
  6. fseek(archivo, sizeof(struct personas)*(buscarpersona(archivo, codigo)-1), 0);
  7. //La funcion buscar persona me devuelve el registro buscado, resto uno para posicionarme y despues "borrar"
  8. fread(&persona, sizeof(struct personas), 1, archivo);
  9.  
  10. strcpy(persona.borrado, "s");
  11.  
  12. fseek(archivo, sizeof(struct personas)*(buscarpersona(archivo, codigo)-1), 0);  /* vuelvo a posicionar el cursor correctamente */
  13.  
  14. fwrite(&persona, sizeof(struct personas), 1, archivo); // despues guardo
  15. fclose(archivo);

Para no llamar a la funcion buscapersona() dos veces te conviene almacenar en una variable lo q retorna, y usar ese dato en los fseek

Saludos


Título: Re: Manejo de archivos en C. Borrar registro
Publicado por: Torino10 en 15 Mayo 2012, 03:12 am
Hola! Gracias por responder!

Les comento que realice las correcciones que me dijeron pero me surgio el siguiente problema.

Cuando borro el registro, es decir cuando cambio al valor 's', se me esta modificando el registro anterior.
Probe quitando el -1 que agrego al valor que devuelve la funcion de busqueda y lo que hace es sobre escribir el registro siguiente.

Que estoy haciendo mal?


Título: Re: Manejo de archivos en C. Borrar registro
Publicado por: Torino10 en 15 Mayo 2012, 03:21 am
Ya solucione el problema!

Estaba mostrando mal los datos y por eso no me daba cuenta de que el borrado era correcto!

Muchisimas gracias por su ayuda!