No se imprimen los datos almacenados en un archivo

Iniciado por BJM, 21 Noviembre 2012, 16:58 PM

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

BJM

El problema esta en la funcion void mostrar(); la cual se encarga de imprimir todos los datos almacenados en 2 archivos llamados "trabajadores.dat" y "salario.dat", pero se me imprimen de manera infinita codigos ilegibles, he chequeado muchas veces la funcion y no encuentro el error.

#include<stdio.h>
#include<conio.h>
#include<ctype.h>

typedef struct {
        int clave;
        char nombre[35];
        char categoria;
        }ttrabajador;
       
typedef struct{
        char categoria;
        int salario;
        }tcategoria;
       
void crear();
void salario();
void mostrar();

main(){
       crear();
       salario();
       mostrar();
       }
       
void crear(){
       FILE *p1;
       ttrabajador nuevo;
       int i;
       p1=fopen("trabajadores.dat","wb+");
       if(p1==NULL){
       printf("\n error");
       }
       printf("\n comienza la carga de registro de trabajadores");
       printf("\n___________________________________________\n");
       for(i=1;i<4;i++){
        printf("\n clave: %d",i);
        nuevo.clave=i;
        printf("\n nombre: ");
        gets(nuevo.nombre);
        fflush(stdin);
        do{
          printf("\n categoria (A-D): ");
          scanf("%c",&nuevo.categoria);
          fflush(stdin);
          nuevo.categoria=toupper(nuevo.categoria);
          }while(nuevo.categoria<'A'||nuevo.categoria>'D');
          fseek(p1,sizeof(ttrabajador)*(i-1),SEEK_SET);
          fwrite(&nuevo,sizeof(ttrabajador),1,p1);
          }
         
       printf("\n");
       printf("\n Listado del archivo recien creado");
       for(i=1;i<4;i++){
       fseek(p1,sizeof(ttrabajador)*(i-1),SEEK_SET);
       fread(&nuevo,sizeof(ttrabajador),1,p1);
       printf("\n clave: %d",nuevo.clave);
       printf("\n nombre: %s", nuevo.nombre);
       printf("\n categoria:%c",nuevo.categoria);
       printf("\n______________________________\n");
       getch();
       }
       fclose(p1);
       getch();
       }

void salario(){
     FILE *p2;
     tcategoria ficha;
     int i=0;
     char categoria;
     p2=fopen("salario.dat","wb+");
     
     while(i<4){
      ficha.categoria='0';
      ficha.salario=0;
      fwrite(&ficha,sizeof(tcategoria),1,p2);
      i++;
      }
      rewind(p2);
      printf("\n\n");
      do{
       fflush(stdin);
           do{
             printf("\n Introduce categoria(A-D)/0(cero) para fin: ");
             scanf("%c",&categoria);
             categoria=toupper(categoria);
             fflush(stdin);
             }while((categoria!='0')&&(categoria<'A'||categoria>'D'));
             if(categoria!='0'){
             fseek(p2,sizeof(tcategoria)*(categoria-65),SEEK_SET);
             fread(&ficha,sizeof(tcategoria),1,p2);
             if(ficha.categoria!='0'){
             printf("\n categoria ya introducida");
             }
             else{
             ficha.categoria=categoria;
             printf("\n Introduce sueldo: ");
             scanf("%d",&ficha.salario);
             fflush(stdin);
             fseek(p2,sizeof(tcategoria)*(categoria-65),SEEK_SET);
             fwrite(&ficha,sizeof(tcategoria),1,p2);
             }
               }
                 }while(categoria!='0');
                 
           printf("\n\n");
           printf(" Listado del archivo salario");
           for(i=0;i<4;i++){
           fseek(p2,sizeof(tcategoria)*(i),SEEK_SET);
           fread(&ficha,sizeof(tcategoria),1,p2);
           printf("\n categoria: %c",ficha.categoria);
           printf("\n sueldo: %d",ficha.salario);
           }
           fclose(p2);
           getch();
           }
           
    void mostrar(){
         
         FILE *p1;
         FILE *p2;
         ttrabajador ficha1;
         tcategoria ficha2;
         int clave;
         
    p1=fopen("trabajadores.dat","rb+");
    p2=fopen("salario.dat","rb+");
   
    if(p1==NULL){
    printf("\n No se puede abrir trabajadores.dat");
               }
                 else{
                      if(p2==NULL){
                      printf("\n no se puede abrir salario.dat");
                      }
                      else
                      {
                   printf("\n\n Clave     nombre     categoria     salario");
                   printf("\n********************************************\n");
                   fread(&ficha1,sizeof(ttrabajador),1,p1);
                   while(!feof(p1)){
                   printf("%-4d",ficha1.clave);
                   printf("%20s",ficha1.nombre);
                   printf("%10c",ficha1.categoria);
                   fseek(p2,sizeof(tcategoria)*(ficha1.categoria-65),SEEK_SET);
                   fread(&ficha2,sizeof(tcategoria),1,p2);
                   printf("%15d",ficha2.salario);
                   }
                   fclose(p1);
                   fclose(p2);
                   }
                      }
                        getch();
                           }
                   

durasno

Hola! el problema de imprimir basura nose porque es, pero el bucle infinito puede ser por esto:
                   fread(&ficha1,sizeof(ttrabajador),1,p1);
                   while(!feof(p1)){
                   printf("%-4d",ficha1.clave);
                   printf("%20s",ficha1.nombre);
                   printf("%10c",ficha1.categoria);
                   fseek(p2,sizeof(tcategoria)*(ficha1.categoria-65),SEEK_SET);
                   fread(&ficha2,sizeof(tcategoria),1,p2);
                   printf("%15d",ficha2.salario);
                   }

te falto incluir dentro del while otra vez:
fread(&ficha1,sizeof(ttrabajador),1,p1);


Saludos

Ahorrate una pregunta, lee el man