/*leggistudente.cpp*/

// Lettura dei dati di uno studente dal
// file studenti.dat in modalità binaria

#include <iostream>
#include <fstream>

using namespace std;

// Struttura dati dello studente. In un programma ben fatto,
// la definizione dello struct dovrebbe apparire soltanto
// in un file header, così da essere condivisa da tutti i programmi
// che la utilizzano senza essere riscritta.
struct studente {
char nome [100];
int matricola;
};

int main (void)
{
// Apriamo subito il file per controllare quanti studenti ci sono dentro
ifstream f ("studenti.dat");

// Posizioniamoci alla fine del file
f.seekg (0, ios::end);

// la lunghezza del file divisa per la dimenzione dello struct
// fornisce il numero di studenti già inseriti
int l = f.tellg() / sizeof(studente);

// Chiediamo all'utente di inserire un numero da 1 a l
int n;
do {
cout << "Inserire un numero da 1 a " << l << ": ";
cin >> n;
} while ( n <= 0 || n > l );

// Dichiariamo una variabile di tipo studente
studente s;

// Posizioniamo il flusso all'inizio del blocco che ci interessa
f.seekg ((n-1)*sizeof(studente), ios::beg);

// Leggiamo il blocco nella variabile s
f.read ((char*)&s, sizeof(studente));

// A questo punto il file non ci serve più
f.close ();

// Scriviamo a video i dati estratti
cout << "Nome: " << s.nome << "\nMatricola: " << s.matricola << endl;

return 0;
}