PROGRAMMIAMO
C++ - File testo: lettura

Lettura file

L'istruzione per leggere un file è perfettamente simmetrica a quella usata nella scrittura ed è analoga all'istruzione cin usata per acquisire un valore da tastiera. Si confrontino infatti le seguenti due istruzioni:

cin>>num;
ff>>num;

La prima istruzione acquisisce da tastiera il valore della variabile num. La seconda legge il valore di num dal file di stream ff.

Per esemplificare maggiormente, vediamo il seguente programma il quale acquisisce dal file di nome valori.txt una serie di 100 valori double e li visualizza sullo schermo:

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{

fstream ff("valori.txt", ios::in);
double num;
int i;

cout<<"Sequenza di valori letti dal file:\n";

for (i=0;i<100;i++)
        {
        ff>>num;

cout<<num<<"\n";
}

}

I valori vengono letti dal file in sequenza e, automaticamente, dopo ogni valore, la lettura si posiziona sul valore successivo (un po' come avviene in una musicassetta nella quale, dopo l'ascolto di un certo brano, il nastro è già posizionato sul brano successivo).

Quando si leggono dei valori da un file occorre prestare molta attenzione ai caratteri che sono stati scritti nel file stesso e in particolare ai separatori fra un valore e l'altro. Infatti, se un file contiene una serie di valori numerici (come nell'esempio precedente) tali valori dovranno essere separati sempre tra loro con uno dei separatori "standard" (blank, '\n' o '\t'). Infatti in assenza di separazione fra un valore e il successivo la lettura sarebbe impossibile (es. se i numeri 3.14 e 67 fossero scritti su file senza nessuna separazione si avrebbe il valore 3.1467).

L'uso di altri elementi di separazione non standard (come ad esempio trattini '-', virgole ',' o altri simboli) o l'introduzione nel file di scritte o di intestazioni creerebbe problemi in fase di lettura. Per esempio si supponga di avere un file aperto in scrittura con stream 'st' sul quale si vogliono scrivere una serie di voti scolastici (il ciclo termina fornendo un voto negativo). Non sarebbe una buona idea scriverli in questo modo:

for (; ;)
{
cout<<"Inserisci un voto: ";
cin>>voto;

if (voto<0)
    break;

st<<"Il voto è "<<voto<<"\n";

}

Infatti la scritta "Il voto è " verrebbe inserita nel file accanto a ogni voto numerico. Se il file dovesse essere letto da un altro programma, sarebbe necessario leggere anche tale scritta e distinguerla dal valore del voto: un inutile problema che può facilmente essere evitato se non si inseriscono scritte inutili nel file!

 

Controllo di esistenza file

Il C++ non effettua automaticamente nessun controllo di esistenza su un file aperto in lettura. Questo significa che se si apre in lettura un file non esistente, non viene segnalato nessun messaggio di errore e il programma funzionerà in modo sbagliato.

Perciò è buona regola di programmazione, prima di leggere da un file, controllare se esiste. Ciò può essere fatto molto semplicemente in questo modo:

fstream ff("valori.txt", ios::in);

if (!ff) //se il file non esiste
    {
    cout<<"Errore! File non esistente!";
    ff.clear();    // Pulizia dei flag di segnalazione errore
    }
else
    {
    //istruzioni di lettura da file
    }

 

   

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it