PROGRAMMIAMO
C++ - File testo: end of file

Determinare la fine di un file in lettura

Nell'esempio considerato nel paragrafo precedente abbiamo supposto di leggere 100 valori da un file. Ma cosa accade se il file non contiene esattamente 100 valori? Se il file contiene un numero maggiore di valori (es. 200), il programma funziona correttamente leggendo solo i primi 100 valori. Ma se il file contiene meno valori (es. 50), il ciclo si ripete sempre 100 volte, ma solo le prime 50 letture forniranno dei valori corretti e sensati. In parole povere, il ciclo non si arresta automaticamente quando si arriva alla fine del file, ma continua a leggere valori non validi (probabilmente uguali a zero, ma questo non è garantito dal C++).

Il problema si verifica ogni volta che tentiamo di leggere da un file senza conoscere il numero di valori che sono stati memorizzati in esso. Praticamente ciò accade quasi sempre: per esempio se il file contiene il numero di voti scolastici a un certo punto dell'anno, il programma che legge il file non può sapere quanti voti contiene.

Per fortuna il C++ dispone di una funzione di library la quale consente di determinare se un file è terminato oppure no. Consideriamo come esempio il seguente ciclo che legge una serie di valori da un file e li somma fra loro:

fstream fs("valori.txt",ios::in);
double somma=0, x;

while (!fs.eof())
{
fs>>x;

somma = somma + x;
}

La sintassi della funzione eof (end of file) è la seguente:

stream.eof();

dove stream è il nome di uno stream associato a un file aperto in lettura. La funzione torna il valore 1 dopo che è stata tentata una lettura dopo l'ultimo valore memorizzato nel file.

La funzione eof torna true (vero) quando viene incontrata la fine del file in lettura. Usando l'operatore not (!) il ciclo continua finché non viene trovata la fine del file. Per un corretto funzionamento di eof è importante che la verifica venga fatta prima di effettuare la successiva lettura dal file.

Riavvolgere un file in lettura

Spesso ci si trova a dover ricominciare dall'inizio la lettura di un file. La soluzione più semplice, in questi casi, consiste nel chiudere e nel riaprire il file, come nell'esempio seguente:

fstream fs("valori.txt",ios::in);
double somma = 0, , prodotto = 1, x;

while (!fs.eof())
{
fs>>x;

somma = somma + x;
}

cout<<"La somma di tutti i valori vale "<<somma<<"\n";

fs.close();
fs.clear();

fs.open("valori.txt",ios::in);

while (!fs.eof())
{
fs>>x;

prodotto = prodotto * x;
}

cout<<"Il prodotto di tutti i valori vale "<<prodotto<<"\n";

 

Si noti che dopo la chiusura dello stream associato al file (con fs.close), viene effettuato un reset dei flag di errore (fs.clear). Questo è necessario poiché altrimenti, riaprendo il file usando lo stesso stream, il successivo ciclo di lettura terminerebbe subito, poiché fs risulterebbe ancora in uno stato di end of file.

precedente

Sito realizzato in base al template offerto da

http://www.graphixmania.it