Salve a tutti, confido nel vostro aiuto perchè ho riscontrato un problema che non riesco a risolvere. Il mio programma deve ricevere dati da un file che conterrà dati di questo tipo: f12 m12 f23 m21 m2 f23 e così via...
io devo separare gli F dagli M e fare la media.
Il mio problema è semplicemente questo, nella funzione sommaVoti, siccome il programma non sa quanti sono i dati devo fare un ciclo while controllato da eof, il problema è che l'ultimo valore lo prende ma non lo aggiunge alla somma e di conseguenza non lo inserisce nella media. Il programma si comporta come se l'ultimo valore del file non esistesse.

Avevo pensato una volta fuori dal ciclo di riscriverci lo "switch" e funzionerebbe anche, ma vorrei sapere se c'è un modo piu elegante di risolvere questo problema.

Ecco il testo:



codice:
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

void ApriFile(ifstream& inp, ofstream& outp);
void inizializzazione(int& f, int& m, double& F, double& M);
void sommaVoti(ifstream& inp, double& M, double& F, int& m, int& f);
void calcolaMedia(double& M, double& F, int& m, int& f, double& mM, double& mF);
void stampaRisultati(ofstream& outp, double mM, double mF);
int main () {
    double sommaM, sommaF, mediaM, mediaF;
    int contatoreM, contatoreF;
    ifstream inFile;
    ofstream outFile;
    
    ApriFile(inFile, outFile);
    inizializzazione(contatoreF, contatoreM, sommaM, sommaF);
    sommaVoti(inFile, sommaM, sommaF, contatoreM, contatoreF);
    calcolaMedia(sommaM, sommaF, contatoreM, contatoreF, mediaM, mediaF);
    stampaRisultati(outFile, mediaM, mediaF);
    inFile.close();
    outFile.close();
    }
    
void ApriFile(ifstream& inp, ofstream& outp){
     inp.open("C:\\Users\\Gianluca\\Documents\\esercizi programmazione C++\\esercizio 9 pag 314\\input.txt");
     outp.open("C:\\Users\\Gianluca\\Documents\\esercizi programmazione C++\\esercizio 9 pag 314\\output.txt");
     outp<<setprecision(2)<<fixed<<showpoint;
     }
void inizializzazione(int& f, int& m, double& M, double& F){
     F = 0;
     M = 0;
     f = 0;
     m = 0;
     }
void sommaVoti(ifstream& inp, double& M, double& F, int& m, int& f){
     char genere, spazio;
     double gpa;
     inp.get(genere);
     inp>>gpa;
     inp.get(spazio);
     while (inp){
     switch (genere){
            case 'f': 
                      f++;
                      F += gpa;
                      break;
            case 'm': 
                      m++;
                      M += gpa;
                      break;
            
            default: cout<<"C'e' un carattere non valido!"<<endl;
                     break;}
     inp.get(genere);
     inp>>gpa; 
     inp.get(spazio);          
     }
     
     }
void calcolaMedia(double& M, double& F, int& m, int& f, double& mM, double& mF){
     mM = M/m;
     mF = F/f;
     }
void stampaRisultati(ofstream& outp, double mM, double mF){
     outp<<"La media dei voti delle ragazze e' "<<mF<<"."<<endl;
     outp<<"La media dei voti dei ragazzi e' "<<mM<<"."<<endl;
     }