Hola, el siguiente programa crea un fichero, añade un nuevo registro, busca un cliente y ordena los clientes por su nombre:
Código C:
Ver original#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct client{
char nom[10];
char cognom[30];
char adreca[30];
int dia;
int mes;
int any;
long int next; /* Punter al seguent registre */
};
main(){
int op, i; /* Operacio del menu a excutar */
void crear(); /* Modul de creacio del fitxer */
void escriu(); /* Modul que escriu nous registres al fitxer*/
void cerca(); /* Modul per a cercar clients en el fitxer */
int n=12;
int ordenar();
struct client *c; /* Variable per a llegir les dades */
do{ /* Bucle del programa principal, segons valor de op */
do{
printf("1.- Crear el fitxer.\n");
printf("2.- Afegir un nou registre\n");
printf("3.- Cercar clients.\n"); printf("4.- Ordenar clients.\n");
}while( (op < 1) && (op > 5) );
switch(op){
case 1: {crear();
break;}
case 2: { escriu();
break;}
case 3: {cerca();
break;}
case 4: {
qsort(c
, n
, sizeof(c
), ordenar
); /*for(i=1; i <= n; i++)
printf("%s\t%s\n", (c+i)->nom, (c+i)->cognom);*/
break;}
}
}while(op != 5);
} /* fi main */
int ordenar();
void crear() {
int i; /* Control de bucle */
char f; /* Indica la fi del bucle de entrada de dades */
struct client c; /* Variable per a llegir les dades */
FILE *pf; /* Punter al fitxer a crear */
void escriu();/* Llegeix els nous registres al fitxer */
/* Creacio del fitxer */
if((pf
=fopen("corty","wb"))== NULL
){
printf("\n ERRADA AL CREAR EL FITXER CORTY \n");
}
/* Escriptura dels registre primaris amb valors buits */
c.nom[0]='b';/* Valor inicial del nom, sera buit el registre */ //}
c.nom[1]='u'; //}}
c.nom[2]='i'; //}}}}esto es igual strcpy(c.nom,"buit");
c.nom[3]='t'; //}}}
c.nom[4]='\0'; //}}
c.next=-1; //}
for (i=1; i<=12; i++){ /* Crea buits els registres primaris */
printf("\nCrea registre %d\n",i
);
}
fclose(pf
); /* Tanca el fitxer que em creat */
do{
printf("Entrada de dades dels Clients:\n\n");
escriu();
}while((f != 'n') && (f != 'N'));
} /* Fi de crear */
void hueco(FILE *p, /* Punter al fitxer persona*/
int x, /* Resultat del hash */
struct client y /* Dades del nou registre */ ){
int j; /* Per a veure si el registre triat pel hash es buit */
long int k,m; /* Guarda a posicio de l'ultim registre de la llista */
struct client c1; /* Valors dels registre anteriors al nou */
char buit[5];
buit[0]='b';
buit[1]='u';
buit[2]='i';
buit[3]='t';
buit[4]='\0';
fseek(p
,x
*/*este asterisco es multiplicacion*/sizeof(c1
),SEEK_SET
);
fread(&c1
,sizeof(c1
),1,p
); /* Llegeix registre per a veure si es ple */
j
=strcmp(c1.
nom,buit
); /* Igual a valor inicial? */
if (j == 0) /* Registre buit */
{
fseek(p
,x
*/*este asterispersonaco es multiplicacion*/sizeof(y
),SEEK_SET
);
}
else { /* El registre primari no es buit */
/* Ha de buscar l'ultim de la cadena */
while(c1.next != -1){
/* Situa el punter al seguent de la
llista */
fseek(p
,c1.
next,SEEK_SET
);
k
=ftell(p
); /* Guarda la posicio per
si es l'ultim */
/* LLegeix el registre */
fread(&c1
,sizeof(c1
),1,p
);
}
/* Guardar el nou registre */
fseek(p
,0,SEEK_END
); /* Va al final del
fitxer per guardar el
nou registre */
m
=ftell(p
); /* Posicio de l'ultim de la
llista */
/* A d'assignar la posicio del l'ultim
a seu predecessor */
c1.next=m;
/* Posicio del registre predecessor per a
sobrescriure'l */
}
}
void cerca(){
struct client c1; /* Llegeix el registres fins trobar el que volem */
int x; /* Resultat del hash */
char n[30]; /* Nom del client a cerca */
int d,m,a; /* Data de neiximent del client a cerca */
int j; /* Resultat de comparar les cadenes de noms de clinets */
FILE *pf; /* Punter al fitxer */
char f; /* Permet aturar el programa al mostrar les dades */
void leelin(); /* Llegix cadenes amb espais en blanc dintre */
int fhash(); /* Modul que calcula la funcio hash aplidar */
if((pf
=fopen("corty","rb"))== NULL
){
printf("\n ERRADA AL OBRIR EL FITXER CORTY \n");
}
printf("\nCOGNOM del Client a CERCAR :");
leelin(&n,29);
printf("\nData de Neiximent: ");
x=fhash(d,m,a); /* Calcula el hash */
fseek(pf
,x
*sizeof(c1
),SEEK_SET
);
do{
fread(&c1
,sizeof(c1
),1,pf
);
if(j == 0) {/* Trobat */
printf("\n%s %s\n",c1.
nom,c1.
cognom);
printf("\nPrem una tecla....");
}
fseek(pf
,c1.
next,SEEK_SET
);
}while ((c1.next != -1) && (j != 0 ));
if (j != 0){
printf("\nPrem una tecla....");
}
} /* fi de cerca */
int fhash(int day, int month, int year){ /* Calcula el hash en funcio de la
data de neiximent */
int res; /* Resultat del hash */
res=(day + month + year) % 12; /* Formula del hash */
return(res); /* Torna al modul cridant el resultat del hash */
} /* Fi de fhash */
void escriu(){/*Modul que llegeix els nous registres i crida a hueco*/
struct client c; /* Variable per a llegir les dades */
FILE *pf; /* Punter al fitxer a personacrear */
int i; /* Pren el valor tornat per la funcio fhash */
int fhash(); /* Modul que calcula la funcio hash aplidar */
void leelin(); /* Llegix cadenes amb espais en blanc dintre */
void hueco(); /* Escriu el nou registre al fitxer */
if((pf
=fopen("corty","rb+"))== NULL
){
printf("\nERRADA AL OBRIR FITXER\n");
}
leelin(&c.nom,9);
leelin(&c.cognom,29);
leelin(&c.adreca,29);
printf("\nData de Neiximent: ");
c.next=-1; /* No apunta a cap registre,es l'ultim*/
i=fhash(c.dia,c.mes,c.any); /*Calcula el hash*/
hueco(pf,i,c); /* Modul que escriu al fitxer els nous registres */
} /* Fi de escriu */
void leelin(char *linia,int lon){
/* Funcio que llegeix linies amb qualsevol caracter menys el LF,
caracter 10 taula ASCII de 7 bits */
/* Permet llegir linies amb espais en blanc */
int i; /* Caracter d'entrada com a sencers */
int j; /* Comtador del nombre de caracters llegits */
j=0;
do{ /*Filtrat de LF o blancs inicials */
}
while((i==10) || (i==32));
*(linia+j)=i; /* Assigna el 1er caracter llegit */
j++; /* S'incrementa despres de llegir el 1er caracter */
while((i!=10) && (j<=lon)){ /* Fins llegir el caracter LF o
superar la longitud del vector */
i
=getchar(); /* Pren caracters del tecla */
if((i!=10) && (j <= lon))
*(linia+j)=i; /* Assigna el caracters llegits */
else
*(linia+j)='\0'; /* Marca la fi de la cadena */
j++; /* Incrementa el comptador de caracters llegits */
}
} /* fi de leelin */
int ordenar(struct client *c1, struct client *c2){
return (strcmp(c1
->nom
, c2
->nom
)); }
Cuando le doy a la opción de ordenar me da fallo de segmentación, ¿por qué?