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