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();
}
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