#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 */