Ciao!

Ho provato a modificare il programma facendo in modo che possa acquisire anche numeri dall'utente. Questi vengono memorizzati nel file ingresso.txt e suddivisi da un return ("\n"). Il problema ora è che feof() legge una volta di troppo i valori (perchè scandaglia anche la nuova riga vuota), segnala una riga in più di quella che dovrebbe esserci e, stranamente, somma due volte l'ultimo valore (mi sfugge il perchè). Ho ovviato a questo inconveniente facendo:

codice:
nrLines--;
sum -= value;
Esiste una soluzione più elegante?
Qualcuno può spiegarmi il perchè dell'aggiunta dell'ultimo valore?

Grazie!

Segue il sorgente completo

codice:
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

#define MAX 20
#define FILE_INPUT "ingresso.txt"
#define FILE_OUTPUT "uscita.txt"

int main(){
    
    //variabili
    int choose = 0;
    
    //Prototipi
    void scriviRis(void);
    void addNumbers(void);
    void deleteNumbers(void);
    
    while(choose < 3){
                 
         puts("Che cosa si desidera fare?");
         puts("1) Inserire numeri sul file");
         puts("2) Scrivere la somma dei numeri sul file");
         puts("Premere un qualunque altro tasto per uscire dal programma");
         puts("-------");
         printf("Scelta: ");
         scanf("%d", &choose);
    
         switch(choose){

              case 1: 
                  //inserisco una nuova riga sul file FILE_INPUT
                  addNumbers();
                  break;
              case 2:
		  //scrivo il risultato in FILE_OUTPUT
                  scriviRis();
                  break;
              default:
                  printf("Bye!\n");
                  
         }
         
         //Svuoto il buffer dello standard input
         fflush(stdin);
         
         puts("-------");
         
    }
    
    return(0);
}

void addNumbers(void){ 

    // Puntatori ai file
    FILE *in; 
    
    // Numero da inserire
    float num;

    // Apro il file FILE_INPUT in lettura e associo il suo indirizzo a un puntatore
    if(!(in = fopen(FILE_INPUT, "a"))){ 
            
        printf("Impossibile aprire il file di input.");
        exit(-1);
        
    } else {
           
         printf("Scrivi il numero da inserire sul file: ");
         scanf("%f", &num);
        
         //Scrivo il numero inserito dall'utente
         fprintf(in, "%.2f\n", num);
         
         //chiudo il canale ai file
         fclose(in); 
    
         puts("Scrittura del numero su file eseguita correttamente");

    }
    
}

void scriviRis(void){ 

    //Puntatori ai file
    FILE *in, *out; 
    
    //array che contiene i caratteri estratti
    char line[MAX]; 
    float value = 0, sum = 0; 
    int nrLines = 0; 

    //Apro il file FILE_INPUT in lettura e associo il suo indirizzo a un puntatore
    if(!(in = fopen(FILE_INPUT, "r"))){ 
            
        printf("Impossibile aprire il file di input.");
        exit(-1);
        
    } else {
        
        //Apro il file FILE_OUTPUT in scrittura dalla coda. Se non esiste lo crea.
        if(!(out = fopen(FILE_OUTPUT, "a"))){ 
                 
            printf("Impossibile aprire il file di output."); 
            exit(-1);
            
        } else {
               
            //scorre il file fino alla fine
            while(!(feof(in))){ 
                                
                 //prelevo una linea di massimo MAX caratteri dall'input
                fgets(line, MAX, in);  
                //estraggo il valore reale contenuto nella linea 
                value = atof(line);
                //faccio la somma dei valori che di volta in volta estraggo
                sum += value;  
                //incremento il numero di linee presenti nel file
                nrLines++;  
                
            } 
            
            //Decremento di uno il numero delle righe. Infatti l'ultima riga viene letta anche se vuota
            nrLines--;
            sum -= value;
            
            //Scrivo su file FILE_OUTPUT
            fprintf(out, "Il file di origine contiene al momento %d numeri aventi somma %.2f\n", nrLines, sum); 

            //chiudo il canale ai file
            fclose(in); 
            fclose(out);
    
            puts("Scrittura su file eseguita correttamente");
        }
    }
    
}