Manejo de archivos en C. Borrar registro

Iniciado por Torino10, 13 Mayo 2012, 06:18 AM

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

Torino10

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.


FILE *archivo;
struct personas persona;

archivo=fopen("personas.txt", "rb+");

fseek(archivo, sizeof(struct personas)*(buscarpersona(archivo, codigo)-1), 0);
//La funcion buscar persona me devuelve el registro buscado, resto uno para posicionarme y despues "borrar"
fread(&persona, sizeof(struct personas), 1, archivo);

strcpy(persona.borrado, "s");

fwrite(&persona, sizeof(struct personas), 1, archivo);
fclose(archivo);           


Espero que me puedan tirar unas ideas. Saludos y gracias!
"Tanto si crees que puedes, como si crees que no puedes, estas en lo correcto"

satu

Hola

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

Saludos
Breakbeat como forma de vida

durasno

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
FILE *archivo;
struct personas persona;

archivo=fopen("personas.txt", "rb+");

fseek(archivo, sizeof(struct personas)*(buscarpersona(archivo, codigo)-1), 0);
//La funcion buscar persona me devuelve el registro buscado, resto uno para posicionarme y despues "borrar"
fread(&persona, sizeof(struct personas), 1, archivo);

strcpy(persona.borrado, "s");

fseek(archivo, sizeof(struct personas)*(buscarpersona(archivo, codigo)-1), 0);  /* vuelvo a posicionar el cursor correctamente */

fwrite(&persona, sizeof(struct personas), 1, archivo); // despues guardo
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
Ahorrate una pregunta, lee el man

Torino10

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?
"Tanto si crees que puedes, como si crees que no puedes, estas en lo correcto"

Torino10

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!
"Tanto si crees que puedes, como si crees que no puedes, estas en lo correcto"