Salve,
ho un problema da risolvere con i file di testo, argomento per me nuovo.
(Nota: La domanda principale non riguarda i file di testo quindi, se volete potete andare a leggere direttamente alla fine, tenendo presente che commenti e critiche riguardanti il codice scritto qui sotto sono ben accetti. )
Avendo il file di testo "mediaEsami.txt"

De Rossi Mario;13240 28 25 0 24
Caio Mario;15340 28 0 26 24
Bianchi Antonio;12540 26 20 30 25
Ferrara Ciro;13124 30 28 0 27

dove ogni riga è, in generale, del tipo
nome cognome;n.matricola voto1 voto2 voto3 voto4

devo scrivere un programma che mi stampi, dato un numero M, tutti i nomi e le matricole degli studenti che hanno avuto una media maggiore o uguale a M.

So che risolvere con gli array di record (struct) sarebbe più ordinato ma è un argomento non ancora affrontato all'interno del corso. All'infuori di ciò, ogni commento, critica, o spunto che riguarda il codice è ben accetto.

Il codice che ho scritto funziona ed è questo:
codice:
#include <iostream>
#include <fstream>
using namespace std;
#define MAX_LEN 100
#define MAX_STR 65
// PROTOTIPI
void mediaEsami( char nomeFile[] );
// MAIN
int main() {
    char nomeFile[MAX_STR];
    double M; // media

    cout << "Inserisci il nome del file di input: ";
    cin >> nomeFile;

    mediaEsami( nomeFile );

    cout << endl;
    system("pause");
    return 0;
}
void mediaEsami( char nomeFile[] ) {
    ifstream ifile;
    char nome[MAX_STR];
    int matricola;
    int nEsami, voto;
    int somma = 0, nVoti = 0;
    double M;

    ifile.open( nomeFile );
    if ( !ifile ){
    cerr << "Errore. File non trovato.";
    return;
    }

    cout << "Inserisci il numero di esami che gli studenti hanno sostenuto: ";
    cin >> nEsami;

    cout << "Inserisci un valore M, considerando che verranno stampati a video " <<
                "gli studenti con media >= M: ";
    cin >> M;

    while ( !ifile.eof() ) {
        ifile.getline( nome, MAX_STR, ';' );
        ifile >> matricola;
        somma = 0;  // azzero i contatori ad ogni ripetizione del ciclo esterno
        nVoti = 0;
        for ( int i = 0; i < nEsami; i++ ) {
            ifile >> voto;
            if ( voto != 0 ) {
                somma += voto;
                nVoti++;
            }
        }
        if ( ( static_cast<double>(somma) / static_cast<double>( nVoti ) >= M ) )
            cout << nome << " " << matricola << endl;
    }

    ifile.close();
}
L'output è di questo tipo:
codice:
Inserisci il nome del file di input: mediaEsami.txt
Inserisci il numero di esami che gli studenti hanno sostenuto: 4
Inserisci un valore M, considerando che verranno stampati a video gli studenti c
on media >= M: 26

Caio Mario 15340

Ferrara Ciro 13124

Premere un tasto per continuare . . .

Ciò che non capisco è:
Tenendo presente che digito "cout << endl;" solo una volta all'interno della procedura void mediaEsami e non faccio nessuna operazione di estrazione se non quella dal file in input,
Perchè vi sono gli spazi tra i nomi in output?

Grazie.