#define DIMBUF 80 #define DIMNOME 16 #include <stdio.h> #include <string.h> /******************************************** * legge un file di modalita' e frequenze assolute * e scrive un secondo file aggiungendo * frequenze relative e cumulate * Minimizza l'occupazione di memoria facendo * due letture del file */ int main(){ int m; /* modalita' corrente letta dal file */ double fa; /* frequenza assoluta corrente * letta dal file */ double somma; double fr, fc; /* frequenza relativa e cumulata corrente */ FILE *fIn, *fOut; /* file di lettura e scrittura */ char nomeIn[DIMNOME], nomeOut[DIMNOME]; char Linea[DIMBUF]; /* linea di input da tastiera */ printf("Nome file di input "); fgets(Linea,DIMBUF,stdin);/* in questo modo si scarica * tutta la linea di input */ sscanf(Linea,"%s",nomeIn); printf("Nome file di output "); fgets(Linea,DIMBUF,stdin); sscanf(Linea,"%s",nomeOut); if ((fIn=fopen(nomeIn,"r"))==NULL){ printf("File %s non trovato\n",nomeIn); return 1; /* termina con codice 1*/ } if ((fOut=fopen(nomeOut,"w"))==NULL){ printf("Impossibile creare file %s\n",nomeOut); return 1; /* termina con codice 1*/ } /* Legge il file per determinare la somma delle frequenze */ somma=0; while (fgets(Linea,DIMBUF,fIn)!=NULL){/* la lettura fallita dopo l'ultima linea * fara' uscire dal ciclo */ sscanf(Linea,"%d %lf", &m, &fa); somma += fa; } /* while (fgets(Linea,DIMBUF,fIn)!=NULL) */ fclose(fIn); /* chiudo e riapro per leggere da capo */ fIn=fopen(nomeIn,"r"); /* questa volta non puo' fallire */ fprintf(fOut,"Mod.\tFreq.Rel.\tFreq.Cum.\n"); fc=0; while (fgets(Linea,DIMBUF,fIn)!=NULL){ sscanf(Linea,"%d %lf", &m, &fa); fr=fa/somma; fc+=fr; fprintf(fOut,"%d\t%lf\t%lf\n",m,fr,fc); } /* while (fgets(Linea,DIMBUF,fIn)!=NULL) */ return 0; } /* end main */