Volendo essere costruttivo, direi che puoi seguire una logica di questo tipo (tra le tante possibili)...
1 ) predispongo una classe (o anche una struct) che contenga tre elementi: un array di caratteri dove mettere la stringa col nome dell'esame, un intero dove mettere il punteggio ottenuto e un gruppo di altri tre interi dove mettere giorno, mese e anno della data
2 ) conto le righe presenti nel file, semplicemente contando quanti sono gli "a capo" (+1)
3 ) alloco un array di classi (o di struct) in quantità pari alle righe rilevate nel file
4 ) apro il file (fopen())
5 ) avvio un ciclo che si ripeta per tante volte quante sono le righe
6 ) nel ciclo...
a. "carico" le righe una ad una in un buffer di dimensioni adeguate (un ciclo con ripetute chiamate a fgets())
b. analizzo una ad una le stringhe "caricate" per "compilare" gli elementi dell'array di classi o di struct allocato in 3)
c. se una delle righe risulta mal formattata, esco prematuramente dal ciclo
7 ) controllo che il contatore del ciclo sia uguale al numero delle righe (in caso contrario significa che qualche riga è formattata male, o contiene dati non validi)
8 ) chiudo il file aperto in 4)
9 ) se i dati sono stati tutti caricati correttamente, li elaboro come richiede l'esercizio
10 ) dealloco l'array allocato in 3)
Alcuni di questi passaggi "stanno meglio" se isolati in funzioni esterne al main(), anche perché il codice risulta più facile da gestire se diviso in unità il più possibile indipendenti. Per intendersi, il mio main() si limita a poche righe (ovviamente il "grosso" avviene in carica_dati_esami() ):
int main() {
int qe;
Esame *e = carica_dati_esami( kStrNomeFile, &qe );
if( NULL != e ) {
// fai quel che devi fare con i dati "caricati" in e
delete[] e; e = NULL;
}
return 0;
}
Lo sviluppo dell'esercizio può essere anche piuttosto lungo (specie se insisti nel verificare ogni possibile errore, come sarebbe sempre meglio fare), però, se ben organizzato, non è particolarmente complicato.
Se non sai ancora gestire l'allocazione dinamica potresti trovare più semplice predisporre un array di dimensioni fisse sufficiente per contenere il numero massimo di strutture/classi del quale prevedi di poter avere bisogno.
Vedi se ti può essere utile quel che ti ho scritto.