/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Registro Eliminados C

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
_Jav



Registrado: 12 Abr 2013
Mensajes: 7

MensajePublicado: 25/04/2013 2:58 pm
Título: Registro Eliminados C

Buenas noches ! Quisiera que me ayudaran un poco en este codigo...

Código:
void Eliminacion(){
     
     FILE *miarchivo;
     FILE *pfaux;
     FILE *eliminados;
     
     
     if((miarchivo=fopen("trabajadores.txt","rb"))==NULL)
         printf("Error al abrir ficheros");
         else {
              fread(®istro,sizeof(struct P_Nomina),1,miarchivo);
              printf("               |CEDULA |");printf("\t|NOMBRE|");printf("\t|DIRECCION|  ");printf("\t|SUELDO|  \n");
              while(!feof(miarchivo))
              {
                    printf("\n%d.",registro.reg);
                    printf("\t\t%d",registro.cedula);
                    printf("\t\t%s",registro.nombre);
                    printf("\t\t%s",registro.direccion);
                    printf("\t\t%2.f",registro.sueldo);
                   
                    fread(®istro,sizeof(struct P_Nomina),1,miarchivo);
                    }
                    }
              fclose(miarchivo);
     
     
     printf("\n\nTrabajador que quiere eliminar: ");
     scanf("%d",&elimina);
     
                               
     if((miarchivo=fopen("trabajadores.txt","rb"))==NULL)
     printf("ERROR AL ABRIR");
     else
     {
         if((pfaux=fopen("auxiliar.txt","w"))==NULL)
         printf("ERROR AL ABRIR");
      else   {
             if((eliminados=fopen("Registro_Eliminados.txt","w"))==NULL)
             puts("Error");
             else
     
      fread(®istro, sizeof(struct P_Nomina),1,miarchivo);
      while(!feof(miarchivo))
      {
           if(registro.reg!=elimina)
           {
             
               fwrite(®istro,sizeof(struct P_Nomina),1,pfaux);
           }
           if(registro.reg==elimina){
                                fwrite(®istro,sizeof(struct P_Nomina),1,eliminados);
                                }
               fread(®istro, sizeof(struct P_Nomina),1,miarchivo);
               
           }
           }
           fclose(eliminados);
           fclose(pfaux);   
           
           }
           fclose(miarchivo);
           
           
           if((miarchivo=fopen("trabajadores.txt","w"))==NULL)
             printf("Error al abrir");
           else
           {
               if((pfaux=fopen("auxiliar.txt","rb"))==NULL)
               printf("Error al abrir");
            else                                           
            {
                fread(®istro,sizeof(struct P_Nomina),1,pfaux);
                while(!feof(pfaux))
                {
                    fwrite(®istro,sizeof(struct P_Nomina),1,miarchivo);
                    fread(®istro, sizeof(struct P_Nomina),1,pfaux);
                }
            }   
            fclose(pfaux);
            }
            fclose(miarchivo); 
            system("cls");
            printf("Eliminado\n\n"); getch();
            puts("Desea ver archivo de eliminados?  1/2  \n");
            scanf("%i",&u);
            if (u==1){
                      if ((eliminados=fopen("Registro_Eliminados.txt","rb"))==NULL)
                      puts("Error");
                      else
                      {
                          fread(®istro,sizeof(struct P_Nomina),1,eliminados);
                          while(!feof(eliminados)) {
                    printf("\n%d.",registro.reg);
                    printf("\t\t%d",registro.cedula);
                    printf("\t\t%s",registro.nombre);
                    printf("\t\t%s",registro.direccion);
                    printf("\t\t%2.f",registro.sueldo); } } }
          system("pause");
            fclose(eliminados);
           
           
           
           
}




Tengo un pequeño problema, necesito guardar los registros que voy eliminando en otro archivo para mostrarlos posteriormente, como "Eliminados" sucede que solo me guarda un registro de varios que borro.. que opinan al respecto? alguna idea?

Saludos
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7204
Ubicación: Mexico

MensajePublicado: 25/04/2013 6:27 pm
Título:

* Haces referencia a las variables "registro", "elimina" y "u" las cuales no declaras en la función, supongo son globales o faltan su declaraciones. Aquí salvo una buena razón hay que declararlas como locales (a la función).

* Solo debes cerrar el archivo si fue exitosa su apertura. Esta llamada a fclose:
Código:
fclose(miarchivo);

Debe colocarse dentro del cuerpo del else.

* No necesitas de la función feof para procesar todos los registros del archivo. El primer bucle se puede reducir verificando el valor de retorno de fread, uno si la lectura fue exitosa:
Código:
while (fread (®istro, sizeof registro, 1, miarchivo) == 1){
   printf ("\n%d.", registro.reg);
   printf ("\t\t%d", registro.cedula);
   printf ("\t\t%s", registro.nombre);
   printf ("\t\t%s", registro.direccion);
   printf ("\t\t%2.f", registro.sueldo);
}


* Mismo caso con los bucles restantes, hay que eliminar el uso de feof en favor del valor de retorno de fread.

* El porque se imprime un solo registro de los eliminados se debe a que en el bucle donde los imprimes:
Código:
else {
   fread (®istro, sizeof (struct P_Nomina), 1, eliminados);
   while (!feof (eliminados) ) {
      printf ("\n%d.", registro.reg);
      printf ("\t\t%d", registro.cedula);
      printf ("\t\t%s", registro.nombre);
      printf ("\t\t%s", registro.direccion);
      printf ("\t\t%2.f", registro.sueldo);
   }
}

Falta la lectura con fread dentro del bucle.

La función con las correcciones y algunas mas:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

struct P_Nomina {
   int reg;
   int cedula;
   char nombre[123];
   char direccion[123];
   double sueldo;
};

/* ... */

void Eliminacion(void)
{
   FILE *miarchivo;
   FILE *pfaux = NULL;
   FILE *eliminados = NULL;
   
   struct P_Nomina registro;
   int elimina;
   int u;
   
   if ((miarchivo = fopen("trabajadores.txt", "rb")) == NULL)
      puts("Error al abrir ficheros");
   else {
      printf("               |CEDULA |");
      printf("\t|NOMBRE|");
      printf("\t|DIRECCION|  ");
      printf("\t|SUELDO|  \n");
      while (fread (®istro, sizeof registro, 1, miarchivo) == 1){
         printf("\n%d.", registro.reg);
         printf("\t\t%d", registro.cedula);
         printf("\t\t%s", registro.nombre);
         printf("\t\t%s", registro.direccion);
         printf("\t\t%2.f", registro.sueldo);
      }
      fclose(miarchivo);
   }
   
   printf("Que trabajador que quiere eliminar: ");
   scanf("%d", &elimina);
   
   if ((miarchivo = fopen("trabajadores.txt", "rb")) == NULL)
      puts("Error al abrir el archivo de trabajadores");
   else if ((pfaux = fopen("auxiliar.txt", "w")) == NULL)
      puts("Error al abrir el archivo auxiliar");
   else if ((eliminados = fopen("Registro_Eliminados.txt", "w")) == NULL)
      puts("Error al abrir el archivo de eliminados");
   else {
      while (fread(®istro, sizeof registro, 1, miarchivo) == 1)
         if (registro.reg != elimina)
            fwrite(®istro, sizeof registro, 1, pfaux);
         else
            fwrite(®istro, sizeof registro, 1, eliminados);
   }
   if (miarchivo != NULL)
      fclose(miarchivo);
   if (pfaux != NULL)
      fclose(pfaux);
   if (eliminados != NULL)
      fclose(eliminados);
   
   if ((miarchivo = fopen("trabajadores.txt", "w")) == NULL)
      puts("Error al abrir el archivo de trabajadores");
   else if ((pfaux = fopen("auxiliar.txt", "rb")) == NULL){
      fclose(miarchivo);
      puts("Error al abrir el archivo auxiliar");
   }else {
      while (fread(®istro, sizeof registro, 1, pfaux) == 1)
         fwrite(®istro, sizeof registro, 1, miarchivo);
      fclose(miarchivo);
      fclose(pfaux);
   }
   
   system("cls");
   printf("Eliminado\n\n");
   getch();
   
   puts("Desea ver archivo de eliminados?  1/2");
   scanf("%i", &u);
   if (u == 1){
      if ((eliminados = fopen("Registro_Eliminados.txt", "rb")) == NULL)
         puts("Error al abrir el archivo de eliminados");
      else {
         while (fread(®istro, sizeof registro, 1, eliminados) == 1){
            printf("\n%d.", registro.reg);
            printf("\t\t%d", registro.cedula);
            printf("\t\t%s", registro.nombre);
            printf("\t\t%s", registro.direccion);
            printf("\t\t%2.f", registro.sueldo);
         }
         fclose(eliminados);
      }
   }
   system("pause");
}


Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
_Jav



Registrado: 12 Abr 2013
Mensajes: 7

MensajePublicado: 26/04/2013 2:12 pm
Título:

Me dejaste muy claro en algunas cosas... Cuando borro cualquiera sea el 1 por ejemplo... me sale en el nuevo archivo esa persona borrada... hasta ahí perfecto cuando vuelvo a eliminar otro.. el anterior borrado no aparece solo el que borre en el momento... será que habrá que escribir con un fwrite cada vez que borre uno nuevo ? te dejare el código completo


Código:
struct P_Nomina {
char nombre[80];
char direccion[80];
int cedula;
float sueldo;
int reg;
} registro;

int b,modifica,ultima=1,elimina,report;
void gotoxy ( int column, int file)
{
     COORD coord ;
     coord.X = column;
     coord.Y = file ;
     
     SetConsoleCursorPosition(GetStdHandle ( STD_OUTPUT_HANDLE),coord);
     }

void Menu(){
     time_t tiempo = time(0);
        struct tm *tlocal = localtime(&tiempo);
        char output[128];
        strftime(output,128,"%d/%m/%y %H:%M:%S",tlocal);
        printf("                                                                            Fecha y hora:   %s\n",output);
           
            printf("\n\t\t\t\t\t\t--------------\n");
            printf("\t\t\t\t\t\t |Bienvenido|\n");
           
            printf("\t\t\t\t\t\t--------------\n");
    printf( "\n--------------------------------------------------------------------------------------------------\n\n");
printf( "\t\t\t\t\t\tNOMINA DE TRABAJADORES \n");
printf("\t\t\t\t\t  -------------------------------");
    printf("\n\n");
    printf("Indique la accion deseada sin importar mayusculas o minisculas . . .");             
    printf("\n\n\n\tA] Agregar Trabajadores\n");
    printf("\n\n\tB] Ver trabajadores\n");
    printf("\n\n\tC] Ver reporte y deducciones por trabajador\n");
    printf("\n\n\n\tD] Eliminar\n\n\n\n");
   
    printf("    E-Salir\n\n\n");
    printf("_____ >\t ");
}

void Agregar(){
     
    FILE* miarchivo;
    char* nombrearchivo= "trabajadores.txt";
   
     if((miarchivo=fopen("trabajadores.txt","rb"))!=NULL)
        {
                  fread(®istro,sizeof(struct P_Nomina),1,miarchivo);
                  while(!feof(miarchivo))
                  {
                     ultima=registro.reg;
                     printf("\n");
                  fread(®istro,sizeof(struct P_Nomina),1,miarchivo);
                  }
                  ultima++;
                  }
                  fclose(miarchivo);
   
   
   if((miarchivo=fopen("trabajadores.txt","ab"))==NULL)
        printf("Error al abrir");
        else{

     printf("\tTrabajador: %d\n\n",ultima);
             registro.reg=ultima;
     printf("\n\t|CEDULA |");printf("\t\t|NOMBRE|");printf("\t|DIRECCION|  ");printf("\t|SUELDO|  ");
     fflush(stdin);
     gotoxy (9,9);
     scanf(" %i", ®istro.cedula);
     
   
   
     
     fflush(stdin);
     gotoxy (32,9);
     scanf(" %[^\n]", ®istro.nombre);
     
   
   
     
     fflush(stdin);
     gotoxy (50,9);
     scanf(" %[^\n]", ®istro.direccion);
     
   
     
     fflush(stdin);
     gotoxy (66,9);
     scanf("%f", ®istro.sueldo);
     
   
    fwrite(®istro, sizeof(struct P_Nomina), 1, miarchivo);
    fclose(miarchivo);
   
    system("cls");
   
}
}
     
void Ver(){
     
     
    FILE* miarchivo;
       

    if((miarchivo=fopen("trabajadores.txt","rb"))==NULL)
         printf("Error al abrir ficheros");
         else {
              fread(®istro,sizeof(struct P_Nomina),1,miarchivo);
              printf("\n\t        |CEDULA|");printf("\t|NOMBRE|");printf("\t|DIRECCION|  ");printf("\t|SUELDO|  \n");
              while(!feof(miarchivo))
              {
                    printf("\n%d.",registro.reg);
                    printf("\t\t%d",registro.cedula);
                    printf("\t\t%s",registro.nombre);
                    printf("\t\t%s",registro.direccion);
                    printf("\t\t%2.f",registro.sueldo);
                   
                    fread(®istro,sizeof(struct P_Nomina),1,miarchivo);
                    }
                    }
              fclose(miarchivo);
              printf("\n\n\n\n");
              printf("Presiona cualquier tecla para ir al menu...   "); getch(); system("cls");
              }

void Reporte(){
     
     int repor,op;
      float lph,sso,hcm,caja,sueldoneto,cajadeahorro;
     
      FILE* miarchivo;
      char* nombrearchivo= "trabajadores.txt";
     
      if((miarchivo=fopen("trabajadores.txt","rb"))==NULL)
         printf("Error al abrir ficheros");
         else {
              fread(®istro,sizeof(struct P_Nomina),1,miarchivo);
              printf("               |CEDULA |");printf("\t|NOMBRE|");printf("\t|DIRECCION|  ");printf("\t|SUELDO|  \n");
              while(!feof(miarchivo))
              {
                    printf("\n%d-",registro.reg);
                    printf("\t\t%d",registro.cedula);
                    printf("\t\t%s",registro.nombre);
                    printf("\t\t%s",registro.direccion);
                    printf("\t\t%2.f",registro.sueldo);
                   
                    fread(®istro,sizeof(struct P_Nomina),1,miarchivo);
                    }
                    }
              fclose(miarchivo);
     

     
      Inicio:
      printf("\n\n\tIntroduzca el numero del usuario a verificar");
      printf("\t_____ > ");
      scanf("%d",&repor);
     
     
   
   if ((miarchivo = fopen ("trabajadores.txt", "r")) == NULL)
      printf ("Error al abrir");
   else {
      while (fread(®istro, sizeof(struct P_Nomina), 1, miarchivo) == 1){
         if (registro.reg == repor){                                           
            printf("\n\nDatos del trabajador %d\n\n", repor);
             
           
   
               
                      lph=registro.sueldo*0.03;
                      sso=(registro.sueldo*0.02);
                      hcm=(registro.sueldo*0.05);
                      cajadeahorro=(registro.sueldo*0.15);
                      sueldoneto=(registro.sueldo-lph-sso-hcm-cajadeahorro);
               
                 printf("\n\n|*****************************************************************************|\n\n");
                 printf("Dev-C.C.A"); printf("\t\t\t\t\tPeriodo:    |15-03-2013|"); printf("\n\t\t\t\t\t\t\t    |30-03-2013|");
                 printf("\n\n\n|Empleado: %s|",registro.nombre); printf("\t  Cedula: %d",registro.cedula);
                 printf("\n\n                 |Asignacion: %.2f|\t\t|Deducciones|",registro.sueldo); 
                 printf("\n\n\t\t\t\t\t\t\t|L.P.H: 3 %% %.2f|",lph); printf("\n\t\t\t\t\t\t\t|S.S.O: 2 %% %.2f|",sso); printf("\n\t\t\t\t\t\t\t|H.C.M: 5 %% %.2f|",hcm); printf("\n\t\t\t\t\t      |Caja de ahorro: 15 %% %.2f|\n",cajadeahorro);
                 printf("\n\n\n\t         |Asignacion: %.2f|",registro.sueldo); printf("        |Sueldo neto a Pagar:  %.2f|",sueldoneto);
                 printf("\n******************************************************************************|");
       
        printf("\n   Si desea ver el sueldo de otro trabajador presione 1, ir al MENU 2 >\t");
        scanf("%i",&op);
                        if(op==1){ goto Inicio; }
                        fflush(stdin);
        system("cls");
        return;
}
}
}
}



void Eliminacion(){
     
   FILE *miarchivo;
   FILE *pfaux = NULL;
   FILE *eliminados = NULL;
   
   struct P_Nomina registro;
   int elimina;
   int u;
   
   if ((miarchivo = fopen("trabajadores.txt", "rb")) == NULL)
      puts("Error al abrir ficheros");
   else {
      printf("               |CEDULA |");
      printf("\t|NOMBRE|");
      printf("\t|DIRECCION|  ");
      printf("\t|SUELDO|  \n");
      while (fread (®istro, sizeof registro, 1, miarchivo) == 1){
         printf("\n%d.", registro.reg);
         printf("\t\t%d", registro.cedula);
         printf("\t\t%s", registro.nombre);
         printf("\t\t%s", registro.direccion);
         printf("\t\t%2.f", registro.sueldo);
      }
      fclose(miarchivo);
   }
   
   printf("\nQue trabajador que quiere eliminar: ");
   scanf("%d", &elimina);
   
   if ((miarchivo = fopen("trabajadores.txt", "rb")) == NULL)
      puts("Error al abrir el archivo de trabajadores");
   else if ((pfaux = fopen("auxiliar.txt", "w")) == NULL)
      puts("Error al abrir el archivo auxiliar");
   else if ((eliminados = fopen("Registro_Eliminados.txt", "w")) == NULL)
      puts("Error al abrir el archivo de eliminados");
   else {
      while (fread(®istro, sizeof registro, 1, miarchivo) == 1)
         if (registro.reg != elimina)
            fwrite(®istro, sizeof registro, 1, pfaux);
         else
            fwrite(®istro, sizeof registro, 1, eliminados);
   }
   if (miarchivo != NULL)
      fclose(miarchivo);
   if (pfaux != NULL)
      fclose(pfaux);
   if (eliminados != NULL)
      fclose(eliminados);
   
   if ((miarchivo = fopen("trabajadores.txt", "w")) == NULL)
      puts("Error al abrir el archivo de trabajadores");
   else if ((pfaux = fopen("auxiliar.txt", "rb")) == NULL){
      fclose(miarchivo);
      puts("Error al abrir el archivo auxiliar");
   }else {
      while (fread(®istro, sizeof registro, 1, pfaux) == 1)
         fwrite(®istro, sizeof registro, 1, miarchivo);
      fclose(miarchivo);
      fclose(pfaux);
   }
   
   system("cls");
   printf("Eliminado\n\n");
   getch();
   
   puts("Desea ver archivo de eliminados?  1/2");
   scanf("%i", &u);
   if (u == 1){
      if ((eliminados = fopen("Registro_Eliminados.txt", "rb")) == NULL)
         puts("Error al abrir el archivo de eliminados");
      else {
         while (fread(®istro, sizeof registro, 1, eliminados) == 1){
            printf("\n%d.", registro.reg);
            printf("\t\t%d", registro.cedula);
            printf("\t\t%s", registro.nombre);
            printf("\t\t%s", registro.direccion);
            printf("\t\t%2.f", registro.sueldo);
         }
         fclose(eliminados);
      }
   }
   puts("\n");
   system("pause");
}

 





int main(){
    system("color 1E");
    FILE* miarchivo;
    FILE* pfaux;
         
        char opcion;
        int exit = 0;
       
       
 
        while (!exit)
        {       
                Menu();
               
                scanf("%c", &opcion);
system("cls");
                switch(tolower(opcion))
                {
                       
                        break;                                               
                        case 'a':
                                Agregar(miarchivo);
                        break;
                        case 'b':
                                Ver(miarchivo);
                        break;
                        case 'c':
                                Reporte(miarchivo);
                         
                        break;
                        case 'd':
                             Eliminacion(miarchivo);
                        break;         
                        case 'e':
                             return-1;
                system("cls");
                }
        }
 
        return 0;
}
     
     
]




Pd: haz sido de mucha ayuda, he aprendido cosas que ni con mi prof. ! Mil gracias. Saludos
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7204
Ubicación: Mexico

MensajePublicado: 26/04/2013 3:38 pm
Título:

_Jav escribió:
Me dejaste muy claro en algunas cosas... Cuando borro cualquiera sea el 1 por ejemplo... me sale en el nuevo archivo esa persona borrada... hasta ahí perfecto cuando vuelvo a eliminar otro.. el anterior borrado no aparece solo el que borre en el momento

Eso es normal ya que el archivo se abre en el modo "w":
Código:
else if ((eliminados = fopen("Registro_Eliminados.txt", "w")) == NULL)
   puts("Error al abrir el archivo de eliminados");

En ese modo cuando el archivo existe su contenido se pierde.

Si quieres mantener un listado de todos los registros eliminados solo tienes que abrir el archivo en el modo "a". Con este si el archivo existe su contenido se preserva ya que las operaciones de escritura se realizan al final de el.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
_Jav



Registrado: 12 Abr 2013
Mensajes: 7

MensajePublicado: 26/04/2013 4:07 pm
Título:

Cita:
En ese modo cuando el archivo existe su contenido se pierde.

Si quieres mantener un listado de todos los registros eliminados solo tienes que abrir el archivo en el modo "a". Con este si el archivo existe su contenido se preserva ya que las operaciones de escritura se realizan al final de el.


CIERTO ! wow, se me habia pasado, y yo pensando que habia algun problema con el fwrite. Y seria en modo "ab" para agregar al final del archivo

Saludos y gracias
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com