Tutorial C ++: informazioni su input e output

01

di 08

Un nuovo modo di produrre

Codice del programma
traffic_analyzer / Getty Images

C ++ mantiene un'altissima compatibilità all'indietro con C, quindi può essere incluso per darti accesso a printf () funzione per l'output. Tuttavia, l'I / O fornito da C ++ è significativamente più potente e, soprattutto, sicuro per i tipi. Puoi ancora usare anche scanf () per input ma le caratteristiche di sicurezza del tipo fornite da C ++ significano che le tue applicazioni saranno più robuste se usi C ++.

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

instagram viewer
<< 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 . Diversi manipolatori accettano un parametro e questi vengono .

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 l'antenato di . Li ho raggruppati per funzione piuttosto che in ordine alfabetico.

  • 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.

instagram story viewer