L'I/O in C++ e' basato sul concetto di stream. Uno stream rappresenta un flusso di dati da cui e' possibile prelevare caratteri (input stream) inserire caratteri (output stream) I vari tipi di stream sono rappresentati nella Standard Library mediante una gerarchia di classi istream : definisce uno stream di input che puo' essere utilizzato per leggere dati ostream : definisce uno stream di output che puo' essere utilizzato per scrivere dati istream eostream sono istanziazioni delle classi template basic_istream<> e basic_ostream<> che usanochar come tipo di carattere wistream ewostream sono istanziazioni delle classi template basic_istream<> e basic_ostream<> che usanowchar_t come tipo di carattere Laboratorio di Informatica 136
istream eostream sono utilizzate come classi base di varie classi concrete. Per poter leggere o scrivere su uno stream e' necessario istanziare, a seconda delle esigenze, una delle classi concrete, ad es.ifstream,ofstream,istringstream, ostringstream class ifstream : public istream {...; definisce uno stream di input che puo' essere utilizzato per leggere dati da file class ofstream : public ostream {...; definisce uno stream di input che puo' essere utilizzato per scrivere dati su file Per utilizzare ifstream e ofstream bisogna includere <fstream> Laboratorio di Informatica 137
class istringstream : public istream {...; definisce uno stream di input che puo' essere utilizzato per leggere dati dastring class ostringstream : public ostream {...; definisce uno stream di input che puo' essere utilizzato per scrivere dati sustring Per utilizzare istringstream e ostringstream bisogna includere <stringstream> La definizione di argomenti di tipo istream& e ostream& permette, grazie al polimorfismo, di scrivere codice utilizzabile qualunque sia il tipo concreto di stream a cui tali argomenti si riferiscono. class MyParser { public: void parse(istream &is); ; void doparse() { ifstream ifs("c:\\mydoc.txt"); MyParser parser; parser.parse(ifs); string s = ; istringstream iss(s); parser.parse(iss); Laboratorio di Informatica 138
Modalità di lettura/scrittura da/a stream input/output formattato input/output non formattato Input/Output formattato: Si usano gli operatori di estrazione e inserimento ( operator>> e operator<<) L operatore di estrazione da stream usa gli spazi per separare i valori in input Input/Output non formattato: int istream::get(); istream& getline(char* pch, int count, char delim = '\n' ); istream& read( char* pch, int ncount ); ostream& put( char ch ); ostream& write( const char* pch, int ncount ); Laboratorio di Informatica 139
: apertura di uno stream su file ios::in ios::out ios::app Apre un file in input Apre un file in output. L uso diios::out su unofstream senza specificare ios::app, ios::ate, o ios::in, implica l utilizzo implicito di ios::trunc Apre un file in output e aggiunge l'output alla fine del file ios::ate Apre un file esistente (in input o output) e si sposta alla fine del file. ios::trunc Elimina il contenuto del file se esiste ios::nocreate Apre un file solo se già esiste. Se il file non esiste l'operazione fallisce ios::noreplace Apre un file solo se non esiste. Se il file esiste l'operazione fallisce ios::binary Apre un file in modalità binaria (il default è la modalità testo). Laboratorio di Informatica 140
: apertura di uno stream su file La modalità di apertura viene specificata come argomento del costruttore ios::open_mode iosmode = ios::binary; ifstream ifs1( file1, iosmode); ifstream ifs2( file2 ); // il default è ios::in ofstream ofs1( file1, ios::app); ofstream ofs2( file2 ); // il default è ios::out ios::trunc o come argomento del metodo open ifstream ifs3; ifs3.open(filepath3, iosmode ); Come sappiamo se l apertura dello stream è fallita? Laboratorio di Informatica 141
: apertura di uno stream su file Per sapere se l apertura dello stream è fallita si può utilizzare ios::fail if (ifs.fail()){ // open è fallita, ad es. perchè il file non esiste oppure ios::operator! if (!ifs) { // open è fallita, ad es. perchè il file non esiste oppure ios::operator void* (restituisce 0 se failbit o badbit sono impostati a 1) if (ifs) { // open è riuscita Laboratorio di Informatica 142