Codice:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct persona {
char nome[20];
char cognome[20];
int anni;
};
void crea_file(char *);
struct persona crea_s();
void vedi_file(char *);
void stampa(struct persona);
void cerca(char *);
void copia (char *);
void mergeSortS(struct persona[] , int, int, struct persona *);
int compare(struct persona el1, struct persona el2)
{
if (el1.anni > el2.anni)
return 1;
if (el1.anni < el2.anni)
return -1;
if (el1.anni == el2.anni)
return strcmp(el1.cognome,el2.cognome);
}
void mergeS(struct persona v[], int i1, int i2, int fine, struct persona vout[]) {
int i=i1, j=i2, k=i1;
while ( i <= i2-1 && j <= fine ) {
if (compare(v[i], v[j]) < 0) {
vout[k] = v[i];
i++;
}
else {
vout[k] = v[j];
j++;
}
k++;
}
while (i<=i2-1) {
vout[k]=v[i];
i++; k++;
}
while (j<=fine) {
vout[k]=v[j];
j++; k++;
}
for (i=i1; i<=fine; i++) v[i] = vout[i];
}
void mergeSortS(struct persona * v, int iniz, int fine, struct persona vout[]) {
int mid;
if ( iniz < fine ) {
mid = (fine + iniz) / 2;
mergeSortS(v, iniz, mid, vout);
mergeSortS(v, mid+1, fine, vout);
mergeS(v, iniz, mid+1, fine, vout);
}
}
int main(){
char v[20];
printf("***\t Welcome to ex 01 =D *** \n\n\n");
printf("Inserire nome file da creare: ");
scanf("%s",&v);
crea_file(v);
vedi_file(v);
cerca(v);
copia(v);
system("PAUSE");
return 0;
}
void crea_file(char *v){
struct persona p;
FILE *fp;
int fine=0;
int numero=0;
if((fp=fopen(v,"wb"))==NULL){
printf("Errore apertura file -.-' \n");
}
while(!fine){
p=crea_s();
fwrite(&p,sizeof(struct persona),1,fp);
printf("FINE SI=1, NO=0 ");
scanf("%d",&fine);
}
printf("Quale persona vuoi stampare:");
scanf("%d",&numero);
fseek(fp,(numero)*sizeof(struct persona),SEEK_SET);
fread(&p,sizeof(struct persona),1,fp);
printf("\n%s",p.nome);
fclose(fp);
}
struct persona crea_s(){
struct persona p;
printf("\nNome: ");
scanf("%s",p.nome);
printf("\nCognome: ");
scanf("%s",p.cognome);
printf("\nAnni: ");
scanf("%d",&p.anni);
return p;
}
void vedi_file(char *v){
struct persona p[100];
struct persona *b;
FILE *fp;
int i;
int k=0;
if((fp=fopen(v,"rb"))==NULL){
printf("Errore! \n");
}
fread(&p[k],sizeof(struct persona),1,fp);
while(!feof(fp)){
stampa(p[k]);
k++;
fread(&p[k],sizeof(struct persona),1,fp);
}
printf("%d",k);
b = (struct persona *) malloc( sizeof(struct persona) * k);
mergeSortS(p,0,k-1,b);
for(i=0;i<k;i++)
printf("\n%s %s %d\n", b[i].nome, b[i].cognome, b[i].anni);
fclose(fp);
}
void stampa(struct persona p){
printf("\n*************************\n");
printf("* Nome: %s\n",p.nome);
printf("* Cognome: %s\n",p.cognome);
printf("* Anni: %d\n",p.anni);
printf("*************************\n");
}
void cerca(char *v){
struct persona p;
FILE *fp;
char c[20];
int k=0;
if((fp=fopen(v,"rb"))==NULL){
printf("Errore!\n");
}
printf("Inserisci il cognome da ricercare: ");
scanf("%s",c);
while(fread(&p,sizeof(struct persona),1,fp)>0)
if(!strcmp(p.cognome,c)){
printf("Trovato\n");
stampa(p);
}
fclose(fp);
}
void copia(char *v){
struct persona p;
FILE *f_in, *f_out;
int buf[500];
char nf[20];
printf("Nome file in cui si vuol copiare:\n");
scanf("%s",nf);
if((f_in=fopen(v,"rb")) && (f_out=fopen(nf,"wb"))){
size_t b;
while(b=fread(buf,1,500,f_in))
fwrite(buf,1,500,f_out);
}
fclose(f_in);
fclose(f_out);
}