In C era possibile formattare il testo tramite i printf () ,scanf() mentre qui con cout e cin non possiamo fare nulla, invece si, scrivete nel compilatore cout . e esce fuori una bella lista di funzioni metodi ecc…, questa lista serve proprio per accedere alle formattazioni del testo ecc.… e non solo, la nuova libreria input e output è sostenuta dal file header iostream che opera dentro il namespace std; per prima cosa ricordiamo che cosa sono i stream , è il flusso dei dati che vanno e tornano, dati che vanno dal pc alla stampante , oppure dati che dalla tastiera vanno al pc, altri dati che dal disco fisso li passiamo alle chiavette usb ecc.…, tutti questi dati sia file testo che file binari sono i stream e tutti questi hanno in comune che sono input e output
dello stream e sono sotto il controllo del preprocessore che è i file header iostream qui in C++, mentre prima era comandati nel vecchio C dal file header stdio.h
Già con l’ inserimento del comando #include<iostream> ora e prima con <stdio.h > vengono aperti automaticamente 3 sistemi di stream che sono stdin, stdout, stderr ,
dove std sta per standard, invece in = input ingresso, err= error errori, out= output uscita , ma il vero significato della parola è produzione , in input abbiamo quello che entra ovvero dati che entrano verso il computer, quando leggiamo un cd o dvd o quando scriviamo sulla tastiera quello è input , quello che scriviamo dentro un cd o dvd oppure la stampa di un foglio o la stampa su video, ovvero tutto quello che va dal computer verso le periferiche quello è output, l’ errori sono i messaggi che riceviamo e questi sono scritti da cerr<< , l’output lo
scriviamo con cout<< e l’ input lo scriviamo con cin<<, questi comandi e altri come leggere
creare i file con fopen ecc.… sono tutti stream, tradotto stream vuol dire ruscello o corrente, infatti corrente luce o dati che corrono verso le periferiche come una corrente di un fiume grazie i bus che sono i cavi interni del computer che collega le varie periferiche al pc , per parlare di dati parliamo di flusso stream è il flusso di dati I/O che va e viene verso il microprocessore del pc
Sotto il preprocessore, che sono i file header, supporta queste operazioni di I/O specialmente
nel nuovo header iostream che legge tutta la lista di tutti i file header, (vedete dentro l’ esplora soluzioni del compilatore (ctrl+alt+L), dentro i file (dipendenze esterne) li vedete tutta la lista dei file header caricati dentro il programma), praticamente sono caricati tutti i file header , il nostro sistema I/O si basa su delle classi template la nostra classe che useremo di più deriva dalla classe principale basic_ios, e si chiama ios_base se aprite la guida del compilatore e nell’ indice si scrive ( ios_base) poi scegliete classe e non metodo li nella classe si vede tutta la lista delle funzioni e metodi adottati da questa classe con le rispettive descrizioni
Comunque esiste 3 tipi di classe principali le classe template che fa capo al (basic_nome) esempio basic_ios, poi c’è la classe per caratteri estesi che come inizio è sempre (wnome) wios inoltre c’è la classe per caratteri semplici con nome ios oppure come nella guida ios_base i nomi di queste classi I/O che nascono da ios_base sono : fstream, ifstream, ios, iostream, istream, istringstream ofstream, ostream, ostringstream, streambuf e stringstream, ecco una tabella della CNR di bologna, da base_ios nasce ios, da ios nasce istream e ostream, da istream abbiamo istringstream, ifstream e iostream, da ostream nasce iostream, ofstream e ostrnstream da iostream nasce fstream e stringstream come detto prima per accedere ad i stream in C++ abbiamo cin>> per la tastiera e per il video abbiamo cout<<,cerr<<, clog<< (simile a cerr<< ma con buffer completo) poi ci sono la versione caratteri estesi wide che inizia con w anziché con c pertanto abbiamo win, wout, werr,wlog per formattare i nostri testi dobbiamo usare i comandi allegati alla classe di ios_base per i stream cout<<,cerr<<, clog<< e cin>> per la lista completa dei membri della classe come detto vedere la guida del
compilatore ( F1 in indice cercare ios_base, poi aprite su (classe) c’è tutta la lista e il significato di ogni parola chiave nelle parole chiave con il nome in italiano non è quella aprite il collegamento e vedete il vero nome come binaria è binary ma vi porta dentro openmode, ugualmente anche nella guida online in internet )
Ora vediamo come si accede alla classe ios per attivare le formattazioni che ci serve la
funzione setf() che attiva le formattazioni , la sua sintassi è: stream.setf(classe::flag); lo stream come detto è cin, cout , ecc… setf sta per settare i flag la classe deve essere una delle classi dello stream fstream, ifstream, ios, iostream, istream, ofstream, ostream, streambuf , il flag è la lista che si apre quando usiamo l’ operatore di scope ( :: ), per attivare setf() dopo lo stream. ,dopo il punto si apre la lista delle classi e funzioni dove possiamo scegliere anche la
funzione setf() un esempio per usare un numero scientifico usiamo prima la formattazione cout.setf (ios::scientific); poi facciamo seguire il numero che dobbiamo formattare cout<<12.33; abbiamo il risultato a schermo il numero scientifico 1.23300000e+01 se desideriamo formattare più cose possiamo farlo utilizzando l’ OR | cosi possiamo scrivere 2 istruzioni o più con un solo cout.setf(ios::showpoint | ios::showpos | ios::ecc..); ora consideriamo che non mi serve il segno + positivo inserito da showpos d’avanti i numeri positivi, io allora posso eliminare questa istruzione con la parola unsetf() che provoca la disattivazione dei flag si scrive : cout.unsetf(ios::showpos); … poi segue il numero successivo cout <<70; cosi il simbolo + d’avanti il nuovo numero è disattivato
Tramite l’ overload possiamo modificare la forma di setf () vediamo in dettaglio e guardare dopo la virgola ,classe::flagx dove flagx deve essere uno dei flag precedenti alla virgola, esempio se flagx è flag1 solo questo flag1 viene attivato , possiamo anche avere più flag anche qui divisi dall’ OR | classe::flag2 in questo caso entrambi i flag sarebbero accettati :
stream.setf(classe::flag1 | classe::flag2 , classe::flagx | classe::flag2 );
Un esempio pratico showpos inserisce un segno (+ più ) verso i numeri positivi ,mentre showpoint inserisce dei zeri dopo un numero reale con la virgola ecco un piccolo programma
f sta per funzione fa, fb, ferase, fexit chi copia il mio programma deve inserire (using namespace sts;) per il resto può rimanere cosi oppure dopo ogni ; e } si va a capo in una nuova linea il programma scrive e inizializza 4 numeri 1 intero e 3 double, le 4 variabili sono inserite nella parte globale , poi li facciamo stampare su video e in seguito mettiamo i flag, poi ristampiamo i nuovi risultati, questo è uguale per le 2 funzioni fa(), fb() , con ferase() si annulla il settaggio dei flag di fa() in modo che fb() sia di nuovo con i numeri iniziali delle 4 variabili iniziali globali se non c’è la funzione ferase() è possibile vedere che i nuovi numeri sono stampati come all’ uscita della funzione fa(), per togliere ferase() basta inserire il commento /*
ferase()*/, fexit() serve per uscire dal programma, guardare la posizione / chiamata delle 4 funzioni dentro il vero programma int main() { fa (); ferase (); fb (); fexit (); } , ecco il programma sviluppato nell’ esecuzione confrontate i dati che sono dentro le righe :
#include<iostream> using namespace std;
int a = 12; double b = 177.100, c = -100.12, d = 1.8;
void fa (); void ferase (); void fexit (); void fb ();
int main () {
fa (); ferase (); fb (); fexit (); }
void fa () {
cout << "-- A Numeri inseriti:
" << "\n " << a << " // " << b
<< " // " << c << " // " << d
<< " risultato:\n" << " -------------------------------------------------------";
cout.setf (ios::showpoint | ios::showpos,ios::showpos | ios::showpoint);
cout << "\n >>> " << a << " * " << b << " * " << c << " * " << d << " <<<\n"<<" -------------------------------------------------------";
cout << "\n prodotto dall'algoritmo:\n [cout.setf (ios::showpoint | ios::showpos \n ,ios::showpos |ios::showpoint);]\n\n"; }
void ferase () { cout << "\n<> Cancelliamo l' algoritmi precedenti con l'istruzioni<>: \n [cout.unsetf (ios::showpoint | ios::showpos);]\n\n" ; cout.unsetf (ios::showpoint | ios::showpos); }
void fexit () {cout << "\n ByMpt-Zorobabele\n Uscita
(premere un tasto + invio): "; char zx; cin >> zx; }
void fb () {
cout << "-- B Numeri inseriti: " << "\n " << a << " // " << b << " // " << c << " // " << d
<< " risultato:\n" << "
-------------------------------------------------------";
cout.setf (ios::showpoint |ios::showpos,ios::showpos);
cout << "\n >>> " << a << " * " << b << " * " << c << " * " << d << " <<<\n
-------------------------------------------------------\n";
cout << "\n prodotto dall'algoritmo:\n [cout.setf (ios::showpoint | ios::showpos,ios::showpos );]\n
come possibile vedere e' attivo solo showpos \n con il + nei numeri positivi
\n"; }
Vediamo alcuni flag e il loro utilizzo : adjustifield racchiude internal, left , right, dove left e right inserisce caratteri di riempimento left riempie la sinistra , right riempie la destra e internal riempie il centro del campo , basefiel racchiude dec, hex e oct rispettivamente inserisce o estrae i valori numerici in formato decimale, esadecimale e ottale floatfield racchiude fixed e scientific inserisce i valori in virgola mobile , in formato virgola fissa o formato scientifico ovvero con o senza il campo dell’ esponente boolalpha inserisce o estrae oggetti di tipo bool true o false anziche i numeri 0 negativo o altri positivi showbase inserisce i prefissi per i numeri ad esempio se si utilizza un numero esadecimale prima del numero inserisce 0x la base esadecimale showpoint inserisce in modo non condizionale un punto
decimale in un campo a virgola mobile ovvero tratta i numeri in diversi modi 1 quintale è 100 chili ma è anche 0.1 tonnellate , sono anche 1000 ettogrammi showpos inserisce in un
campo positivo il segno + skipws elimina i spazi vuoti iniziali , se skipws() è uguale a 0 i spazi vuoti non vengono eliminati unitbuf scarica l’ output dopo ogni inserimento uppercase cambia le scritte minuscolo in maiuscolo n uppercase N
Se desideriamo conoscere la posizione o meglio situazione dei flag se sono attivi o meno senza modificare il loro stato, ios ci mette a disposizione una funzione che ci riconsegna un numero intero (long) esadecimale con la base corrente di ogni flag 1 attivo 0 non attivo oppure true o false , la funzione è flags() e il suo formato è fmtflags flags(); con ios::fmtflags f; in f abbiamo lo stato in cui si trova il flag che come detto può essere un numero di tipo long
0 o 1 il fmtflags è un typedef e riconosce solo i suoi “membri” che è la lista dei tipi dei flag
copio una funzione per leggere questo stato di tutti i flag la funzione leggi_stato_flag{ con il comando ios::fmtflags riconosce i tipi di typedef e in f legge lo stato dei flag con f=(long) ) cout.flags(); , con la variabile long i; si crea il ciclo per leggere tutti i flags for (i=0x4000; i; i=i >> 1) con >> 1 si presume che di fare controlli di bit a bit infatti si usa il controllo if (i & f ) cout<<” true 1 ”; else cout<<” false 0 “; & and a bit , se i e f sono uguali scrivi true 1 altrimenti false 0, ecco la funzione prototipo :
leggi_stato_flag {( ios::fmtflags f; long i; f=(long) cout.flags();
for (i=0x4000; i; i=i >> 1) if (i & f ) cout<<” true 1 ”; else cout<<” false 0 “;
cout<<endl; }
Un altro modo di accedere nei flags potrebbe essere in modo indiretto per mezzo di una variabile ( long f ) la stessa variabile che abbiamo visto su dal comando ios::fmtflags f; anzi che chiamare con cout.setf(ios::nome_flag | ecc..) ; possibile chiamare in causa la variabile (long f ) riconosciuta da fmtflags ecco una prototipo con la chiamata diretta tramite la funzione flags(f); cosi abbiamo attivato ugualmente i vari flags, importante la variabile f long e la chiamata tramite cout.flags(f) altrimenti non funziona nulla, controllate con la funzione prima espressa :
long f= ios::showpos | ios::showbase | ecc… ; cout.flags(f);
ecco il programma che racchiude le 2 forme di attivare i flags, poi il metodo per controllare i stessi flags attivi o meno alcuni saranno attivati all’ inizio ma poi saranno disattivati :
#include<iostream> using namespace std;
void leggi_flags (); int main (){
cout << " Prima di attivare i flag solo 2 sono attivi, poi si \n disattivano perche' se si sceglie un controllo non e'\n possibile scegliere l'altro, come esempio si deve scegliere;
\n un numero decimale esadecimale oppure ottale \n\n "; leggi_flags ();
long f = ios::showpos | ios::showbase | ios::oct | ios::right; cout.flags (f);
cout << "\n\n Dopo di aver attivato i primi 4 flag \n\n"; leggi_flags ();
cout.setf ( ios::showpoint | ios::fixed);
cout << "\n\n Dopo di aver attivato tutti 6 flag \n\n"; leggi_flags ();
cout << "\n\n ByMpt-Zorobabele\n
Per uscire [premere un tasto + invio]: "; char zx; cin>> zx; }
void leggi_flags () { ios::fmtflags f; long i; f = (long)cout.flags ();
for(i = 0x4000; i; i = i >> 1) if(i & f) cout << " 1 True ";
else cout << " 0 False "; cout << " \n"; }
Altri 3 comandi o meglio funzioni che servono per la formattazione del video output con width() si specifica un’ampiezza minima di un campo si usa con stream.width(n); lo stream è cout, (n) è il numero dell’ ampiezza che si desidera se n è 12 e dobbiamo scrivere un numero 1
il numero 1 rimane nel 12mo carattere, se il numero era 500.000 l’ ultimo 0 rimane nel 12mo spazio tutto quello prima del numero 5 rimane spazio vuoto nel caso che il nostro numero supera l’ ampiezza il numero non viene troncato, con stream.fill(‘ch’); possiamo riempire con un carattere lo spazio vuoto cout.fill(‘*’); nei spazi vuoti creati da width () inseriamo il carattere specificato da (‘ch’) dove nel nostro caso nell’ esempio è l’ asterisco * , nel nostro caso il numero 1 con width(12); avremo 11 stellette poi il numero 1 , nel caso il numero era da 5 cifre avremo avuto 7 stellette più il numero stream.precisi0n(n) questo comando Specifica il numero di cifre da visualizzare in un numero a virgola mobile cosi taglia (n) di cifre di solito la precisione standard è impostata a 6 cifre dopo il numero intero cosi di tutto quel numero può essere tagliato, con un numero tagliamo l’ eccesso del numero su un numero di 6 cifre 100.203 se impostiamo (3) rimarremo solo con 100 e se il numero è più piccolo (2) avremo un numero di 1e+02 in altre parole , se il numero è fixed il (n) conta (n) dopo i decimali , con lo scientific con (n) viene tagliate anche le cifre significative questi comandi sono validi solo per il primo stream d’ output che incontra, pertanto nel prossimo (cout<<) non ha effetto queste
istruzioni fill(‘*’); width(n);precisi0n(n); n sono sempre numeri interi
Ciao grazie da ByMpt-Zorobabele
Testo PDF aggiornato con questo ultimo capitolo inserito lo trovate :
http://www.freeforumzone.com/d/11266858/Elenco-figure-dei-comandi-della-programmazione-C-TESTO-PDF/discussione.aspx
Anche qui di queste discussioni che inserisco faccio un testo PDF da poter scaricare tutto il mio
materiale è da utilizzare come desiderate per il testo PDF vedi cartella dedicata , ogni volta cambia ubicazione del testo allora cambio il file e il testo lo inserisco dentro la cartella < file aggiornato ad oggi >
[Modificato da JehovaZorobabele 27/10/2016 23:36]