IL CONCETTO DI FILE Un file è una astrazione fornita dal sistema operativo, il cui scopo è consentire la memorizzazione di informazioni su memoria di massa. Concettualmente, un file è una sequenza di registrazioni (record) uniformi, cioè dello stesso tipo. Un file è un astrazione di memorizzazione di dimensione potenzialmente illimitata (ma non infinita), ad accesso sequenziale. Una testina di lettura/scrittura (concettuale) indica in ogni istante il record corrente: inizialmente, la testina si trova per ipotesi sulla prima posizione dopo ogni operazione di lettura / scrittura, essa si sposta sulla registrazione successiva. È illecito operare oltre la fine del file. 1
OPERARE SU I FILE A livello di sistema operativo un file è denotato univocamente dal suo nome assoluto, che comprende il percorso e il nome relativo. In certi sistemi operativi il percorso può comprendere anche il nome dell unità. in DOS o Windows: C:\temp\prova1.c in UNIX e Linux: /usr/temp/prova1.c Per operare su un file dall interno di un programma occorre stabilire una corrispondenza fra: il nome del file come risulta al sistema operativo un nome di variabile definita nel programma. Questa operazione si chiama apertura del file. 2
OPERARE SU I FILE Dopo l'apertura, il programma può operare sul file operando formalmente sulla variabile che lo rappresenta: il sistema operativo provvederà a effettuare l operazione richiesta sul file associato a tale simbolo. Al termine, la corrispondenza fra nome del file e variabile usata dal programma per operare su esso dovrà essere soppressa, mediante l operazione di chiusura del file. 3
OPERARE SU I FILE Tipi di file E possibile gestire due tipi di file: File di testo (bytestream) File di record Il File di testo consente di memorizzare i dati come una sequenza di caratteri. Ogni lettura dal file legge una sequenza di caratteri fino al primo carattere separatore (\t, \n, \b ) incontrato. L accesso al file e SEQUENZIALE. Ogni scrittura scrive sul file la sequenza la sequenza di caratteri indicata Il File di record consente di memorizzare i dati secondo un tracciato record identificato dai campi di una struttura. Ogni scrittura scrive sul file tutti i campi della struttura identificati da una variabile Ogni lettura legge dal file tutti i campi appartenenti alla struttura. L accesso al file puo essere sia SEQUENZIALE che DIRETTO, ovvero accesso ad un record ben preciso. 4
GESTIONE FILE IN C++ IOS open, close, eof,... >>, << ISSTREAM OSSTREAM IOSTREAM cin, cout >>, << FSTREAM Fstream e la classe per la gestione di file su disco. Consente di stabilire un canale di comunicazione tra la memoria principale e la memoria di massa per effettuare operazioni di lettura e scrittura sui file. Ogni volta che si vuole operare con un file dobbiamo eseguire le seguenti operazioni: 1. Aprire il canale di comunicazione 2. Scegliere la modalita di comunicazione (lettura, scrittura, lettura e scrittura) 3. Eseguire tutte le operazioni sul file 4. Chiudere il canale di comunicazione quando non si vuole piu interagire con il file 5
GESTIONE FILE IN C++ Principali funzionalita della classe FSTREAM open ( nome_file,modo) //apre il canale di comunicazione modo puo assumere i seguenti valori: ios::in (apertura in lettura) ios::out (apertura in scrittura) ios::app(apertura in append) close ( ) // chiude il canale di comunicazione eof() // verifica se e stata raggiunta la fine del file write(string string,, dim) // scrive una stringa di lunghezza dim << // overloading dell operatore << per scrivere sul file read(buffer,dim) // legge dim byte dal file e li mem. in buffer >> // overloading dell operatore >> per leggere dal file seekg(n,posizione) // sposta la testina di lettura di n byte a partire dalla posizione specificata posizione puo assumere i seguenti valori: ios::cur (indica la posizione corrente) ios::beg (indica l inizio del file) ios::end (indica la fine del file) 6
GESTIONE FILE IN C++: Esempio FILE DI TESTO <include iostream.h> <include fstream.h> // per utilizzare la classe fstream void main ( ) { fstream f; // dichiarazione oggetto della classe fstream char *riga = new char[256]; f.open( pippo,ios::app); cin >> riga; while (!strcmp(riga, ok )) { f.close(); f << riga; cin >> riga; f.open( pippo,ios::in); while (!f.eof()) { f.close(); f >> riga; cout >> riga; 7
GESTIONE FILE IN C++: Esempio FILE DI RECORD #include<fstream.h> #include <iostream.h> #include<stdlib.h> struct dipendente { int ID; char cognome[20]; char nome[20]; double stipendio; ; void main() { const char * const archivio="c:\\cris\\dip.dat"; fstream f; int m=1; char r = 's'; dipendente p; f.open(archivio,ios::out ios::binary); if (!f) { cout << "Errore in apertura del file " << archivio << "\n"; exit(1); while(1) { p.id = m++; cout << "Inserisci il cognome --> "; cin >> p.cognome; cout << "\ninserisci il nome --> "; cin >> p.nome; cout << "\ninserisci lo stipendio --> "; cin >> p.stipendio; cout << '\n'<<p.cognome << ' ' << p.nome << ' ' << p.stipendio; cout << "\nconfermi i dati? (s/n) "; cin >> r; if (r == 's') f.write((char *) &p, sizeof(p)); cout << "Vuoi inserire un altro dipendente? (s/n) "; cin >> r; if (r == 's') cout << "\n\n"; else break; 8 f.close();
GESTIONE FILE IN C++: Esempio f.open(archivio,ios::in ios::binary); if (!f) { cout << "Errore in apertura del file " << archivio << "\n"; exit(1); // Accesso sequenziale f.seekg(0); f.read((char *) &p, sizeof(p)); while (!f.eof()) { cout << '\n'<<p.cognome << ' ' << p.nome << ' ' << p.stipendio << '\n'; f.read((char *) &p, sizeof(p)); // Accesso diretto f.open(archivio,ios::out ios::binary); if (!f) { cout << "Errore in apertura del file " << archivio << "\n"; exit(1); long l = sizeof(p); cout << \ninserisci la matricola del dipendente --> ; cin >> m; f.seekg((m-1)*l); f.read((char *) &p, sizeof(p)); cout << '\n'<<p.cognome << ' ' << p.nome << ' ' << p.stipendio << '\n'; f.close(); 9