Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    12

    [c++] I/O da file e ciclo while controllato da eof

    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;
         }

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Prendi in input delle stringhe, se nel file le scrivi separate da degli spazi, te ne legge una alla volta senza bisogno di prendere in input un carattere fittizio come spazio.
    Diventa un :

    codice:
    while( inp >> stringa)
    {
        <analizza la stringa>
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    12
    ok così verrebbe scritto meglio, ma comunque non mi analizza l'ultima stringa....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.