Tipo: l’insieme dei valori che può assumere una variabile (semplice o strutturata) e l’insieme delle operazioni che possono applicarsi a tali valori.
Classe: la definizione di un tipo esteso che racchiude sia i valori che lo caratterizzano (proprietà), sia gli operatori che agiscono su quei valori (metodi).
Incapsulamento dati
I metodi come unico punto di accesso (interfaccia) alle sue proprietà.
Lo stato di un oggetto (l’insieme delle sue proprietà) può essere modificato solo attraverso l’interfaccia progettata (Oscuramento/Protezione dati).
cin.precision(2);
cin.precision = 2
Uno stream è un’astrazione, che rappresenta un “qualcosa” da o verso cui “fluisce” una sequenza di bytes
può essere interpretato come un “file intelligente” (con proprietà e metodi), che agisce come “sorgente” da cui estrarre (input), o “destinazione” in cui inserire (output) i dati
Esempi di stream:
Un concetto importante è la posizione corrente in uno stream (file position indicator), che coincide con l’indice del prossimo byte che deve essere letto o scritto.
Ogni operazione di I/O modifica la posizione corrente.
La posizione corrente può essere ricavata o modificata direttamente usando particolari metodi.
Gli oggetti stream sono organizzati secondo una gerarchia di classi dette genericamente stream
Ogni classe è specializzata per tipo di operatori di input e output supportati e per il tipo delle sorgenti e destinazioni (file, I/O, stringhe, etc.)
e cin
sono oggetti (globali) rispettivamente delle classi cout
istream
e ostream
di cui conosciamo già alcuni metodi:
cin>>dato
; (operatore di estrazione)
cin.getline(char s[]
, int n
, char c='\n')
cin.get
(char s[]
, int n
, char c='\n')
; (operatore di inserimento)cout<<dato
;cout.width
(ampiezza)
;cout.precision
(cifre)
Il file di testo è un file che contiene caratteri ASCII.
Nome del file fisico: una stringa che indica il percorso e il nome del file sul supporto di memoria
Un file di testo può essere immaginato come una successione di caratteri leggibili, separati da carattere speciali:
La posizione corrente nel file (file position indicator), durante la lettura o la scrittura dei caratteri è memorizzata nell’oggetto file.
FPI può essere spostato in qualsiasi parte del file con l’uso di opportuni metodi.
Supponiamo che il contenuto di un file di nome fisico prova.txt, che si trova sul disco rigido sia:
Nel mezzo del cammin di nostra vita <eoln>
mi ritrovai in una selva oscura <eoln> <eof>
Per scrivere questo testo è sufficiente utilizzare un qualsiasi editor (come lo stesso sistema di sviluppo DevCpp oppure Blocco Note sotto Windows).
Per gestire un file in un programma C++ occorre:
<fstream>
ifstream
per la lettura del file o di tipo ofstream
per la scrittura del file ( tale variabile corrisponderà al nome logico del file)Oggetti di tipo file testo in sola lettura:
#include
ifstream inputfile
Oggetti di tipo file testo in sola scrittura:
#include
ofstream outputfile
Oggetti di tipo file testo in lettura e scrittura:
#include
fstream file
La definizione (allocazione) di un oggetto file testo coincide con la sua prima dichiarazione incontrata dal compilatore nel programma
L’apertura del file logico con il conseguente collegamento al file fisico è svolta dal seguente metodo (procedura):
file.open
(nomefile)
L’apertura del file corrisponde all’inizializzazione dell’oggetto file
È possibile definire e insieme inizializzare un file testo:
#include <fstream>
fstream file(nomefile)
Esempio:
ifstream file1;
file1.open("prova.txt");
oppure:
ifstream
file1 (“prova.txt”);
Una volta creata la corrispondenza tra file fisico e file logico, il sistema operativo si occuperà di travasare i dati dall’uno all’altro.
Quando ordiniamo di scrivere sul file logico:
Nella fase di lettura:
La chiusura del file logico con conseguente rilascio del collegamento col file fisico è svolta dal seguente metodo (procedura):
file.close ()
Alla chiusura del file logico le modifiche in esso registrare sono definitivamente scritte sul file fisico
Esempio:
fstream file1
;
file1.open
(“prova.txt”);
… lavora sul file …
file1.close
();
L’apertura di un file (in lettura e/o scrittura) potrebbe non aver successo:
…
L’espressione !(file)
vale true se l’apertura ha successo, false in caso di errore:
Esempio:
ifstream file1
;
file1.open
(“prova.txt”);
if (!file1) {
cerr<<
“Non si può aprire il file\n”;
}
Per leggere una parola da un file si usa l’operatore di estrazione:
file>>parola
file>>carattere
file>>numero prova.txt
Mostra codice...
legge una stringa di caratteri da file fin quando trova uno spazio o la fine linea o tabulazione; la stringa è convertita nel tipo nativo dell'argomento (int, double, char, char, ...)
ritorna un puntatore (a void) non nullo in caso di lettura con successo, nullo altrimenti.
Esempio:
ifstream
;file
file.open
("prova.txt");
while (file>>parola)
{
cout <<parola<<
" ";
}
Per determinare la fine di un file si usa il metodo (funzione)
file.eof()
ritorna
se il FPI è sul carattere true
<eof>
, false altrimenti:
vale true
se non ci sono più caratteri da leggere o se si è scritto un carattere alla fine del file
Esempio:
cout <<
"Nome File="; cin >> Nomefile;
file.open
(Nomefile);
while
(!file1.eof()) {
file1 >>parola;
cout<< parola<endl;
Per leggere un carattere alla volta in un file si usa il metodo:
file.get(c)
(o c = file.get())
c è la variabile di tipo char che conterrà il carattere letto dal buffer
Mostra codicefile.putback ()
Immette nuovamente l'ultimo carattere letto nel buffer (arretrando FPI)
c = file.peek ()
prova.txt
ritorna il prossimo carattere da leggere (senza toglierlo dal buffer e senza spostare FPI)
può essere usato per riconoscere il tipo del prossimo dato prima di leggerlo effettivamente
Mostra codicePer leggere una sequenza di caratteri di un file fino alla fine della riga (<eol>)
si usa il metodo (funzione):
file.getline(s,n,c='\n')
s
è una variabile stringa che conterrà i caratteri letti seguiti dal terminatore ‘\0′
n
è intero che indica il numero massimo di caratteri da leggere
c
(opzionale) è il carattere delimitatore di input: se incontrato la lettura termina, c non è copiato in s e il FPI si posizione subito dopo il delimitatore (che viene saltato)
Per leggere una sequenza di caratteri di un file fino alla fine della riga (<eol>)
si usa il metodo (funzione):
file.getline(s,n,c='\n')
email.txt
Esempio:
ifstream file1
;
file1.open
(“email.txt”);
while (!file1.eof()) {
file1.getline (nome,100,'|');
file1.getline (uname,100,'@');
file1.getline (host,100);
cout<<<
" at "
<<
}
Mostra codicePer saltare la lettura di una sequenza di byte in un file si usa il metodo:
file.ignore (n=1, c=EOF)
email.txt
n
(opzionale) è l’intero che indica il numero di bytes da saltare (se omesso vale 1)
c
(opzionale) è il delimitatore che indica fin dove saltare i bytes (anche il delimitatore è saltato)
Serve per avanzare la lettura senza acquisire dati (non validi)
Esempio:
Mostra codicePer scrivere una parola in un file si usa l’operatore di estrazione
file<<parola
file<<carattere
file<<numero
...
ha come argomento un tipo nativo (int, double [ ] , char , char, …) e lo converte in una stringa di caratteri da scrivere nel file.
Per scrivere un carattere alla volta in un file si usa il metodo:
file.put(c)
c
è la variabile char che contiene il carattere da scrivere nel file
Esempio:
Mostra codiceput
ifstream OpenFile(char *filename, int open_mode);
input_filename_var.open("pathname/filename",ios::in);
output_filename_var.open("pathname/filename",ios::out);
ios::in e ios::out sono opzionali e rappresentano la modalità di accesso al file.
I file possono essere aperti in altre modalità, come, ad esempio, ios::append o ios::binary
Le operazioni standard iniziano con un file vuoto
Se il file esiste → il contenuto viene perso
append:
ofstream outStream;
outStream.open(“prova.txt”, ios::app);
Se il file non esiste → viene creato
Se il file esiste → I dati vengono aggiunti alla fine del file
Esempio: lettura di un archivio studenti
Si abbia un file di tipo testo, “prova01.txt”, contenente le seguenti informazioni rispetto agli studenti di una certa università:
Scrivere un programma che, assegnata una media M in input, stampi il cognome, nome e numero di matricola di tutti gli studenti che hanno una media maggiore o uguale ad M
Esempio:
de Rossi Mario;13240 28 25 0 24
Caio Mario;15340 28 0 26 24
Bianchi Antonio;12540 26 20 30 25
Ferrara Ciro;13124 30 28 0 27
prova2.txt
Esercizi:
1. Sia dato un file testo di nome fisico “studenti.txt” contenente informazioni sugli studenti di un corso (strutturate secondo l’esempio in figura). Dati un intero C rappresentante un codice d’esame, un intero M rappresentante un voto ed un intero N rappresentante un anno, scrivere un algoritmo che dia in output il nome degli studenti che hanno sostenuto l’esame di codice C prima dell’anno N con un voto≥M.
Esempio:
2. Un file testo “parole.txt” contiene, per ogni riga, una serie di parole, ognuna delle quali è seguita da uno spazio o dal carattere . Ogni parola è costituita da caratteri alfabetici e può essere composta da sole lettere maiuscole, sole lettere minuscole o da entrambe. Scrivere una procedura che legga il file “parole.txt” e costruisca due file:
3. Sia dato un file testo “parole.txt” composto da sole lettere maiuscole. Ogni linea di testo è costituita da un carattere seguito da uno spazio e da una serie di parole tutte separate da uno spazio (compreso l’ultima). Tutte le parole di un rigo dovrebbero iniziare o terminare con il carattere di inizio riga. Scrivere una procedura che legga il file “parole.txt” e stampi a video tutte le parole che non verificano la condizione suddetta.
4. Siano dati due file testo: “studenti.txt” e “tesi.txt”. Il primo contiene informazioni riguardanti tutti gli studenti di un corso di laurea; il secondo contiene informazioni riguardanti i soli studenti del medesimo corso di laurea che hanno già fatto richiesta della tesi (vedi figura) Scrivere una procedura che mostri a video la matricola e la media di tutti gli studenti che hanno richiesto la tesi e che hanno svolto tutti gli esami.
1. Prime nozioni di Programmazione
2. C++ elementi di un programma
3. Le istruzioni di I/O standard
5. C++ funzioni matematiche ed espressioni booleane
6. Le strutture di controllo - parte seconda
8. Array di caratteri e tipi astratti
9. Astrazione procedurale: Procedure e Funzioni
10. Astrazione procedurale: Procedure e Funzioni -parte seconda
11. Astrazione procedurale: Procedure e Funzioni - parte terza
12. Librerie
13. Le strutture di controllo - parte terza
14. Algoritmi
16. I File di testo
17. La classe string
silvia-rossi-4306-16-16-esercizio16.1.cpp
silvia-rossi-4306-16-17-esercizio16.2.cpp
silvia-rossi-4306-16-18-esercizio16.3.cpp
silvia-rossi-4306-16-18-esercizio16.4.cpp
silvia-rossi-4306-16-20-esercizio16.5.cpp
silvia-rossi-4306-16-21-esercizio16.6.cpp
silvia-rossi-4306-16-22-esercizio16.7.cpp
silvia-rossi-4306-16-26-esercizio16.8.cpp
silvia-rossi-4306-16-30-esercizio16.9.cpp
silvia-rossi-4306-16-email.txt