01
di 08
Un nuovo modo di produrre

C ++ mantiene un'altissima compatibilità all'indietro con C, quindi
Nella lezione precedente, questo è stato toccato con un esempio che utilizzava cout. Qui andremo un po 'più in profondità iniziando prima con l'output poiché tende ad essere più utilizzato dell'input.
La classe iostream fornisce l'accesso agli oggetti e ai metodi necessari sia per l'output che per l'input. Pensa agli I / O in termini di flussi di byte, che vanno dall'applicazione a un file, allo schermo o a una stampante - che viene emessa o dalla tastiera - che viene immessa.
Uscita con Cout
Se conosci C, potresti saperlo
<< viene utilizzato per spostare i bit verso sinistra. Ad esempio 3 << 3 è 24. Ad esempio, lo spostamento a sinistra raddoppia il valore, quindi 3 spostamenti a sinistra lo moltiplica per 8.In C ++, << è stato stracarico nella classe ostream in modo che int, galleggiantee tipi di stringhe (e relative varianti, ad es doppio) sono tutti supportati. Ecco come si fa l'output del testo, mettendo insieme più elementi tra <<.>
cout << "Some Text" << intvalue << floatdouble << endl;
Questa sintassi peculiare è possibile perché ognuno dei << è in realtà una chiamata di funzione che restituisce a riferimento a uno ostream oggetto. Quindi una linea come quella sopra è in realtà così
cout. << ("qualche testo"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl);
Il C. funzioneprintf è stato in grado di formattare l'output utilizzando gli identificatori di formato come% d. In C ++ cout può anche formattare l'output ma utilizza un modo diverso di farlo.
02
di 08
Utilizzo di Cout per formattare l'output
L'oggetto cout è un membro di iostream biblioteca. Ricorda che questo deve essere incluso in a
#includere
Questa biblioteca iostream è derivato da ostream (per output) e istream per input.
Formattazione dell'output del testo viene eseguito inserendo manipolatori nel flusso di output.
Che cos'è un manipolatore?
È una funzione che può alterare le caratteristiche del flusso di output (e input). Nella pagina precedente lo abbiamo visto << era una funzione sovraccarica che restituiva un riferimento all'oggetto chiamante ad es. cout per output o cin per input. Tutti i manipolatori lo fanno in modo da poterli includere nell'output << o input >>. Vedremo input e >> più avanti in questa lezione.
contare << endl;
endl è un manipolatore che termina la linea (e ne inizia una nuova). È una funzione che può anche essere chiamata in questo modo.
endl (cout);
Sebbene in pratica non lo faresti. Lo usi così.
cout << "Qualche testo" << endl << endl; // Due righe vuote.
I file sono solo flussi
Qualcosa da tenere presente che con molti sviluppi in questi giorni GUI applicazioni, perché avresti bisogno di funzioni I / O di testo? Non è solo per consolle applicazioni? Bene, probabilmente eseguirai l'I / O dei file e puoi usarli anche lì, ma anche ciò che viene emesso sullo schermo di solito ha bisogno di essere formattato. Gli stream sono un modo molto flessibile di gestire input e output e possono lavorare con
- I / O di testo. Come nelle applicazioni console.
- Stringhe. Comodo per la formattazione.
- File I / O.
Manipolatori di nuovo
Anche se abbiamo usato il ostream classe, è una classe derivata dal ios classe che deriva dal ios_base. Questa classe di antenati definisce il pubblico funzioni che sono manipolatori.
03
di 08
Elenco dei manipolatori di Cout
I manipolatori possono essere definiti in flussi di input o output. Questi sono oggetti che restituiscono un riferimento all'oggetto e sono posizionati tra coppie di <<. La maggior parte dei manipolatori è dichiarata in, ma endl, estremità e sciacquone vieni da
Ecco un elenco più dettagliato.
A partire dal
- endl - Termina la linea e chiama flush.
- estremità - Inserisce '\ 0' ( NULLO) nel flusso.
- flush - Forza l'emissione immediata del buffer.
A partire dal . La maggior parte sono dichiarati in
- boolalpha: inserire o estrarre oggetti bool come "true" o "false".
- noboolalpha: consente di inserire o estrarre oggetti bool come valori numerici.
- fixed - Inserisce valori in virgola mobile in formato fisso.
- scientific - Inserisci valori in virgola mobile in formato scientifico.
- internal: giustificazione interna.
- sinistra: giustificazione a sinistra.
- right - Giusta giustificazione.
- dec - Inserisce o estrae valori interi in formato decimale.
- hex - Inserisce o estrae valori interi in formato esadecimale (base 16).
- oct - Inserire o estrarre i valori nel formato ottale (base 8).
- noshowbase - Non prefissa il valore con la sua base.
- showbase - Valore prefisso con la sua base.
- noshowpoint - Non mostrare il punto decimale se non necessario.
- showpoint: mostra sempre il punto decimale quando si inseriscono valori in virgola mobile.
- noshowpos - Non inserire il segno più (+) se il numero> = 0.
- showpos - Inserisci il segno più (+) se il numero> = 0.
- noskipws - Non saltare lo spazio bianco iniziale durante l'estrazione.
- skipws - Salta lo spazio bianco iniziale durante l'estrazione.
- maiuscolo - Non sostituire le lettere minuscole con equivalenti maiuscoli.
- maiuscolo: sostituisce le lettere minuscole con equivalenti maiuscoli.
- unitbuf - Svuota il buffer dopo un inserto.
- nounitbuf - Non svuotare il buffer dopo ogni inserto.
04
di 08
Esempi usando Cout
// ex2_2cpp. #include "stdafx.h" #includereusando lo spazio dei nomi std; int main (int argc, char * argv []) { cout.width (10); cout << a destra << "Test" << endl; cout << sinistra << "Test 2" << endl; cout << interno << "Test 3" << endl; cout << endl; cout.precision (2); cout << 45.678 << endl; cout << maiuscolo << "David" << endl; cout.precision (8); cout << scientifico << endl; cout << 450678762345.123 << endl; cout << fisso << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << ott << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: maiuscolo); cout << hex << endl; cout << 1234 << endl; cout << ott << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; ritorna 0; }
L'output da questo è sotto, con uno o due spazi di riga in più rimossi per chiarezza.
Test. Test 2. Test 3. 46. David. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4D2. 2322. 1234.
Nota: Nonostante le maiuscole, David viene stampato come David e non DAVID. Questo perché le maiuscole influiscono solo sull'output generato, ad es. numeri stampati in esadecimale. Quindi l'uscita esadecimale 4d2 è 4D2 quando è in maiuscolo.
Inoltre, la maggior parte di questi manipolatori effettivamente posizionano un po 'in una bandiera ed è possibile impostarlo direttamente con
cout.setf ()
e cancellalo con
cout.unsetf ()
05
di 08
Utilizzo di Setf e Unsetf per manipolare la formattazione I / O
La funzione setf ha due stracarico versioni mostrate di seguito. Mentre unsetf cancella solo i bit specificati.
setf (flagvalues); setf (valori di bandiera, valori di maschera); unsetf (flagvalues);
I flag variabili sono derivati da ORing insieme tutti i bit che vuoi con |. Quindi se vuoi scientifico, maiuscolo e boolalfa quindi usa questo. Solo i bit sono passati come parametro sono impostati. Gli altri bit rimangono invariati.
cout.setf (ios_base:: scientific | ios_base:: uppercase | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; valore bool = vero; cout << valore << endl; cout.unsetf (ios_base:: boolalpha); cout << valore << endl;
produce
4D2. 1.234000E + 011. vero. 1.
Bit di mascheramento
Il due parametro la versione di setf usa una maschera. Se il bit è impostato sia nel primo che nel secondo parametro, viene impostato. Se il bit è solo nel secondo parametro, viene cancellato. I valori Adjustfield, Basefield e floatfield (elencati di seguito) sono flag compositi, ovvero diversi flag in OR insieme. Per basefield con i valori 0x0e00 equivale a dec | ott esadecimale. Così
setf (ios_base:: hex, ios_basefield);
cancella tutte e tre le bandiere, quindi imposta esadecimale. allo stesso modo adjustfield è a sinistra | giusto | interno e floatfield è scientifico | fisso.
Elenco di bit
Questo elenco di enumerazioni è tratto da Microsoft Visual C ++ 6.0. I valori effettivi utilizzati sono arbitrari: un altro compilatore può utilizzare valori diversi.
skipws = 0x0001. unitbuf = 0x0002. maiuscolo = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. sinistra = 0x0040. right = 0x0080. interno = 0x0100. dec = 0x0200. ott = 0x0400. hex = 0x0800. scientific = 0x1000. fisso = 0x2000. boolalpha = 0x4000. Adjustfield = 0x01c0. basefield = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0.
06
di 08
Informazioni su Clog e Cerr
Piace cout, zoccolo e cerr sono oggetti predefiniti definiti in ostream. La classe iostream eredita da entrambi ostream e istream quindi è per questo che cout gli esempi possono usare iostream.
Buffered e Unbuffered
- Buffered: tutto l'output è temporaneamente memorizzato in a buffer e poi scaricato sullo schermo in una volta sola. Sia cout che clog sono tamponati.
- Senza buffer: tutto l'output va immediatamente al dispositivo di output. Un esempio di un oggetto senza buffer è cerr.
L'esempio seguente mostra che cerr è usato allo stesso modo di cout.
#includere usando lo spazio dei nomi std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Errore" << endl; ritorna 0; }
Il problema principale con il buffering è se il file programma si arresta in modo anomalo, quindi il contenuto del buffer viene perso ed è più difficile capire perché si sia arrestato in modo anomalo. L'output senza buffer è immediato, quindi potrebbe essere utile cospargere alcune righe come questa attraverso il codice.
cerr << "Accesso alla funzione pericolosa zappit" << endl;
Il problema di registrazione
La creazione di un registro degli eventi del programma può essere un modo utile per individuare bug difficili, il tipo che si verifica solo di tanto in tanto. Se quell'evento è un arresto, tuttavia, si verifica il problema: svuotare il registro su disco dopo ogni chiamata in modo da poter vedere gli eventi fino allo schianto o tenerlo in un buffer e svuotare periodicamente il buffer e sperare di non perdere troppo quando lo schianto si verifica?
07
di 08
Utilizzo di Cin per l'input: input formattato
Esistono due tipi di input.
- Formattato. Lettura dell'input come numeri o di un certo tipo.
- Non formattato. Lettura byte o stringhe. Ciò offre un controllo molto maggiore sul flusso di input.
Ecco un semplice esempio di input formattato.
// excin_1.cpp: definisce il punto di ingresso per l'applicazione console. #include "stdafx.h" // Solo Microsoft. #includere usando lo spazio dei nomi std; int main (int argc, char * argv []) { int a = 0; float b = 0,0; int c = 0; cout << "Inserisci un int, un float e un int separati da spazi" <> a >> b >> c; cout << "Hai inserito" << a << "" << b << "" << c << endl; ritorna 0; }
Questo utilizza cin per leggere tre numeri (int, galleggiante, int) separati da spazi. È necessario premere Invio dopo aver digitato il numero.
3 7.2 3 mostrerà "Hai inserito 3 7.2 3".
L'input formattato ha dei limiti!
Se si immette 3,76 5 8, si ottiene "Hai inserito 3 0,76 5", tutti gli altri valori su quella riga vengono persi. Che si sta comportando correttamente, come il. non fa parte dell'int e quindi segna l'inizio del float.
Trapping di errori
L'oggetto cin imposta un bit di errore se l'input non è stato convertito correttamente. Questo bit fa parte di ios e può essere letto usando il fallire() funzione su entrambi cin e cout come questo.
if (cin.fail ()) // fa qualcosa.
Non sorprendentemente, cout.fail () viene raramente impostato, almeno sullo schermo. In una lezione successiva sull'I / O dei file, vedremo come cout.fail () può diventare vero. C'è anche un bene() funzione per cin, cout eccetera.