Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: lordluisiv en 5 Mayo 2019, 16:01 pm



Título: [Solucion] eliminar/editar contenido de un fichero
Publicado por: lordluisiv en 5 Mayo 2019, 16:01 pm
Buenas :)
 aqui esta la solucion, ahora guarda, carga y edita los datos :)

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <cctype>

/*====================
[Defines]
======================*/
#define cls system("CLS");
#define File_OpenRead doc=fopen("DB_","r");
#define File_OpenWrite doc=fopen("DB_","a+");
/*====================
[Funciones]
======================*/
void guardar();
void cargar();
void buscar();
/*====================
[Base de Datos]
======================*/
FILE *doc;
struct DATA{
char nombre[13];
int edad;
};


/*====================
[Programa]
======================*/
int main()
{
fclose(doc);
int selec;
printf("1.Guardar \n2.Cargar \n3.Buscar \n"); fflush(stdin);
selec = getch();

switch(selec){
case '1':{
cls
guardar();
break;
}
case '2':{
cls
cargar();
break;
}
case '3':{
buscar();
break;
}
}
cls
printf("[ESA OPCION NO EXISTE]\n");
main();

return 0;
}

void guardar()
{
DATA e;
int selec;

File_OpenWrite // abriendo el archivo.

if(doc == NULL)
{
cls
printf("[ERROR EN EL ARCHIVO]\n");
main();
}
do{
cls
printf("Ingrese su nombre: "); fflush(stdin);
gets(e.nombre);

for (char i = 0;  i < strlen(e.nombre) ; i++){
    e.nombre[i] = tolower(e.nombre[i]);
}

printf("Ingrese su edad: "); fflush(stdin);
scanf("%d", &e.edad);

printf("\n\n---Nombre:%s \n---edad: %d\n", e.nombre, e.edad);
printf("\n\n1.desea finalizar el registro? \n2.Registrar otro usuario? \nElija una opcion porfavor: "); fflush(stdin);
selec = getch();
fwrite(&e, sizeof(e),1,doc);

}while(selec == '2');

fclose(doc);
cls
main();
}

void cargar()
{
File_OpenRead
DATA e;

if(doc == NULL)
{
cls
printf("[ERROR EN EL ARCHIVO]\n");
main();
}

fread(&e, sizeof(e),1,doc);
while(!feof(doc)){
printf("\nNombre.....: %s", e.nombre);
printf("\nEdad.........: %d", e.edad);
fread(&e, sizeof(e),1,doc);
}

printf("\n\nPrecione una tecla para volver...");

fclose(doc);
getch();
cls
main();
}

void buscar()
{
  File_OpenWrite
DATA e;

char b_nombre[13];

if(doc == NULL)
{
cls
printf("[ERROR EN EL ARCHIVO]\n");
main();
}
cls
printf("Ingrese el nombre a buscar: \n");fflush(stdin);
gets(b_nombre);

for (char i = 0;  i < strlen(b_nombre) ; i++){
   b_nombre[i] = tolower(b_nombre[i]);
}
cls

while(strcmp(e.nombre, b_nombre)){

fread(&e, sizeof(e),1,doc);

if(feof(doc)){
cls
printf("[NO SE ENCONTRARON RESULTADOS]\n");
main();
}
}

printf("\nNombre.....: %s", e.nombre);
printf("\nEdad.........: %d\n", e.edad);

printf("\n\nPrecione una tecla para volver...");

fclose(doc);
getch();
cls
main();
}

Listo ya logre conseguir la solucion al problema y dejo la solucion aqui para los que necesiten hacer algo parecido..

Funcion: Funciona creando un archivo temporar y mientras que no se encuentre el dato que estas buscando se van guardando los otros...

Código:
void eliminar()
{
File_OpenRead
FILE *d_temp; d_temp = fopen("DB_TEMP", "w");

DATA e;
int b_cedula;

if(doc == NULL)
{
cls
printf("[ERROR EN EL ARCHIVO]\n");
main();
}

cls
printf("Escriba el numero de cedula del usuario que desea eliminar: "); fflush(stdin);
scanf("%d", &b_cedula);

cls
fread(&e, sizeof(e),1,doc);

while(!feof(doc)){

if((e.cedula == b_cedula)==0){
fwrite(&e, sizeof(e),1,d_temp);
}else{
printf("Estos datos han sido eliminados...");
printf("\nNombre.....: %s", e.nombre);
printf("\nCedula.....: %d", e.cedula);
printf("\nEdad.......: %d\n", e.edad);
}

fread(&e, sizeof(e),1,doc);
}

printf("\n\nPrecione una tecla para volver...");

fclose(d_temp);
fclose(doc);
remove("DB_");
rename("DB_TEMP", "DB_");
getch();
cls
main();
}