C ++ - Lernprogramm: Erfahren Sie mehr über Eingabe und Ausgabe

click fraud protection

01

von 08

Ein neuer Weg zur Ausgabe

Programmcode
Verkehrsanalysator / Getty Images

C ++ behält also eine sehr hohe Abwärtskompatibilität mit C bei kann hinzugefügt werden, um Ihnen Zugriff auf die zu geben printf () Funktion für die Ausgabe. Die von C ++ bereitgestellte E / A ist jedoch wesentlich leistungsfähiger und vor allem typsicher. Sie können auch noch verwenden scanf () Für die Eingabe, aber die von C ++ bereitgestellten Typensicherheitsfunktionen bedeuten, dass Ihre Anwendungen robuster sind, wenn Sie C ++ verwenden.

In der vorherigen Lektion wurde dies anhand eines Beispiels angesprochen, in dem cout verwendet wurde. Hier werden wir etwas tiefer gehen, beginnend mit der Ausgabe, da diese tendenziell häufiger verwendet wird als die Eingabe.

Die iostream-Klasse bietet Zugriff auf die Objekte und Methoden, die Sie für die Ausgabe und Eingabe benötigen. Stellen Sie sich I / O als Bytestreams vor - entweder von Ihrer Anwendung zu einer Datei, dem Bildschirm oder einem Drucker - das wird ausgegeben, oder von der Tastatur - das wird eingegeben.

instagram viewer

Ausgabe mit Cout

Wenn Sie C kennen, wissen Sie das vielleicht << wird verwendet, um Bits nach links zu verschieben. ZB 3 << 3 ist 24. Beispielsweise verdoppelt die Linksverschiebung den Wert, sodass 3 Linksverschiebungen ihn mit 8 multiplizieren.

In C ++ << ist gewesen überladen in der ostream klasse damit int, schwebenund Zeichenfolgentypen (und ihre Varianten, z Doppel) werden alle unterstützt. Auf diese Weise geben Sie Text aus, indem Sie mehrere Elemente zwischen << aneinanderreihen.


cout << "Some Text" << intvalue << floatdouble << endl; 

Diese eigentümliche Syntax ist möglich, weil jeder der << ist eigentlich ein Funktionsaufruf, der a zurückgibt Referenz zu einem ostream Objekt. Eine Zeile wie oben ist also tatsächlich so


cout. << ("irgendein Text"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl); 

Die C. Funktionprintf konnte die Ausgabe mit Formatspezifizierern wie% d formatieren. In C ++ kann cout auch die Ausgabe formatieren, verwendet jedoch eine andere Methode.

02

von 08

Verwenden von Cout zum Formatieren der Ausgabe

Das Objekt cout ist Mitglied der iostream Bibliothek. Denken Sie daran, dass dies in a enthalten sein muss


#umfassen 

Diese Bibliothek iostream wird abgeleitet von ostream (für die Ausgabe) und istream zur Eingabe.

Formatierung Die Textausgabe erfolgt durch Einfügen von Manipulatoren in den Ausgabestream.

Was ist ein Manipulator?

Diese Funktion kann die Eigenschaften des Ausgabe- (und Eingabe-) Streams ändern. Auf der vorherigen Seite haben wir das gesehen << war eine überladene Funktion, die einen Verweis auf das aufrufende Objekt zurückgab, z. cout für die Ausgabe oder cin für die Eingabe. Alle Manipulatoren tun dies, damit Sie sie in die Ausgabe aufnehmen können << oder Eingabe >>. Wir werden uns die Eingabe und ansehen >> später in dieser Lektion.


count << endl; 

endl ist ein Manipulator, der die Zeile beendet (und eine neue startet). Es ist eine Funktion, die auch auf diese Weise aufgerufen werden kann.


endl (cout); 

In der Praxis würden Sie das jedoch nicht tun. Du benutzt es so.


cout << "Some Text" << endl << endl; // Zwei Leerzeilen. 

Dateien sind nur Streams

Etwas zu bedenken, dass mit viel Entwicklung in diesen Tagen in getan wird GUI Anwendungen, warum benötigen Sie Text-E / A-Funktionen? Ist das nicht nur für Konsole Anwendungen? Nun, Sie werden wahrscheinlich Datei-E / A ausführen und Sie können sie auch dort verwenden, aber auch was auf dem Bildschirm ausgegeben wird, muss normalerweise ebenfalls formatiert werden. Streams sind eine sehr flexible Methode zur Verarbeitung von Ein- und Ausgaben und können damit arbeiten

  • Text I / O. Wie in Konsolenanwendungen.
  • Saiten. Praktisch zum Formatieren.
  • Datei-E / A.

Wieder Manipulatoren

Obwohl wir die verwendet haben ostream Klasse, es ist eine abgeleitete Klasse von dem ios Klasse, die von der ableitet ios_base. Diese Ahnenklasse definiert die Öffentlichkeit Funktionen das sind Manipulatoren.

03

von 08

Liste der Cout-Manipulatoren

Manipulatoren können in Eingabe- oder Ausgabestreams definiert werden. Dies sind Objekte, die einen Verweis auf das Objekt zurückgeben und zwischen Paaren von platziert werden <<. Die meisten Manipulatoren sind in deklariert, aber endl, endet und spülen komme aus . Mehrere Manipulatoren verwenden einen Parameter, von dem diese stammen .

Hier ist eine detailliertere Liste.

Von

  • endl - Beendet die Leitung und ruft Flush auf.
  • endet - Fügt '\ 0' ein ( NULL) in den Strom.
  • Flush - Erzwingt die sofortige Ausgabe des Puffers.

Von . Die meisten sind in deklariert der Vorfahr von . Ich habe sie eher nach Funktion als nach Alphabet gruppiert.

  • boolalpha - Bool-Objekte als "true" oder "false" einfügen oder extrahieren.
  • noboolalpha - Bool-Objekte als numerische Werte einfügen oder extrahieren.
  • fest - Fügt Gleitkommawerte im festen Format ein.
  • wissenschaftlich - Fügen Sie Gleitkommawerte im wissenschaftlichen Format ein.
  • intern - intern begründen.
  • links - Linksbündig.
  • richtig - Richtig rechtfertigen.
  • dec - Ganzzahlige Werte im Dezimalformat einfügen oder extrahieren.
  • hex - Einfügen oder Extrahieren von Ganzzahlwerten im hexadezimalen Format (Basis 16).
  • oct - Fügen Sie Werte im Oktalformat (Basis 8) ein oder extrahieren Sie sie.
  • noshowbase - Präfixieren Sie den Wert nicht mit seiner Basis.
  • showbase - Präfixwert mit seiner Basis.
  • noshowpoint - Zeigt keinen Dezimalpunkt an, wenn dies nicht erforderlich ist.
  • showpoint - Zeigt beim Einfügen von Gleitkommawerten immer den Dezimalpunkt an.
  • noshowpos - Fügen Sie kein Pluszeichen (+) ein, wenn Nummer> = 0 ist.
  • showpos - Fügen Sie ein Pluszeichen (+) ein, wenn die Zahl> = 0 ist.
  • noskipws - Überspringen Sie beim Extrahieren nicht den anfänglichen Leerraum.
  • skipws - Überspringt den ersten Leerraum beim Extrahieren.
  • Nouppercase - Ersetzen Sie Kleinbuchstaben nicht durch Großbuchstaben.
  • Großbuchstaben - Ersetzen Sie Kleinbuchstaben durch Großbuchstaben.
  • unitbuf - Puffer nach dem Einfügen spülen.
  • nounitbuf - Spülen Sie den Puffer nicht nach jedem Insert.

04

von 08

Beispiele mit Cout

// ex2_2cpp. #include "stdafx.h" #umfassenVerwenden des Namespace std; int main (int argc, char * argv []) { cout.width (10); cout << rechts << "Test" << endl; cout << left << "Test 2" << endl; cout << intern << "Test 3" << endl; cout << endl; cout.precision (2); cout << 45.678 << endl; cout << Großbuchstaben << "David" << endl; cout.precision (8); cout << wissenschaftlich << endl; cout << 450678762345.123 << endl; cout << fixed << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: Großbuchstaben); cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; return 0; }

Die Ausgabe davon ist unten, wobei ein oder zwei zusätzliche Zeilenabstände aus Gründen der Übersichtlichkeit entfernt wurden.

 Prüfung. Test 2. Test 3. 46. David. 4,50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234. 

Hinweis: Trotz des Großbuchstabens wird David als David und nicht als DAVID gedruckt. Dies liegt daran, dass Großbuchstaben nur die generierte Ausgabe beeinflussen, z. Zahlen gedruckt in hexadezimal. Der Hex-Ausgang 4d2 ist also 4D2, wenn Großbuchstaben in Betrieb sind.

Außerdem setzen die meisten dieser Manipulatoren tatsächlich ein Bit in ein Flag, und es ist möglich, dies direkt mit zu setzen

 cout.setf () 

und lösche es mit

 cout.unsetf () 

05

von 08

Verwenden von Setf und Unsetf zum Bearbeiten der E / A-Formatierung

Die Funktion setf hat zwei überladen Versionen unten gezeigt. Während unsetf löscht nur die angegebenen Bits.

 setf (Flagwerte); setf (Flagwerte, Maskenwerte); unsetf (Flagwerte); 

Die Variablenflags werden von abgeleitet ORing zusammen alle gewünschten Bits mit |. Also wenn du willst wissenschaftlich, Großbuchstaben und Boolalpha dann benutze dies. Nur die Bits wurden als übergeben Parameter eingestellt sind. Die anderen Bits bleiben unverändert.

 cout.setf (ios_base:: Scientific | ios_base:: Großbuchstaben | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; bool value = true; cout << value << endl; cout.unsetf (ios_base:: boolalpha); cout << value << endl; 

Produziert

 4D2. 1,234000E + 011. wahr. 1. 

Maskierungsbits

Die Zwei Parameter Die Version von setf verwendet eine Maske. Wenn das Bit sowohl im ersten als auch im zweiten Parameter gesetzt ist, wird es gesetzt. Befindet sich das Bit nur im zweiten Parameter, wird es gelöscht. Die Werte Einstellfeld, Basisfeld und Floatfield (unten aufgeführt) sind zusammengesetzte Flags, dh mehrere Flags Oder würde zusammen. Zum Basisfeld mit den Werten 0x0e00 ist das gleiche wie dec | okt | verhexen. So

 setf (ios_base:: hex, ios_basefield); 

löscht alle drei Flags und setzt dann verhexen. Ähnlich Einstellfeld ist links | rechts | intern und Floatfield ist wissenschaftlich | Fest.

Liste der Bits

Diese Liste der Aufzählungen stammt aus Microsoft Visual C ++ 6.0. Die tatsächlich verwendeten Werte sind beliebig - ein anderer Compiler kann andere Werte verwenden.

 skipws = 0x0001. unitbuf = 0x0002. Großbuchstaben = 0x0004. showbase = 0x0008. Showpoint = 0x0010. showpos = 0x0020. left = 0x0040. rechts = 0x0080. intern = 0x0100. dec = 0x0200. oct = 0x0400. hex = 0x0800. wissenschaftlich = 0x1000. fest = 0x2000. Boolalpha = 0x4000. Einstellfeld = 0x01c0. basefield = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0. 

06

von 08

Über Clog und Cerr

Mögen cout, verstopfen und cerr sind vordefinierte Objekte, die in ostream definiert sind. Die iostream-Klasse erbt von beiden ostream und istream Deshalb cout Beispiele können verwenden iostream.

Gepuffert und ungepuffert

  • Gepuffert - Alle Ausgaben werden vorübergehend in a gespeichert Puffer und dann auf einmal auf den Bildschirm geworfen. Sowohl Cout als auch Clog sind gepuffert.
  • Ungepuffert - Alle Ausgaben gehen sofort an das Ausgabegerät. Ein Beispiel für ein ungepuffertes Objekt ist cerr.

Das folgende Beispiel zeigt, dass cerr genauso verwendet wird wie cout.


#umfassen Verwenden des Namespace std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Fehler" << endl; return 0; }

Das Hauptproblem bei der Pufferung ist, wenn die Programm stürzt ab, dann geht der Pufferinhalt verloren und es ist schwieriger zu erkennen, warum er abgestürzt ist. Die ungepufferte Ausgabe erfolgt sofort, sodass es nützlich sein kann, ein paar Zeilen wie diese durch den Code zu streuen.

 cerr << "Eingabe der gefährlichen Funktion zappit" << endl; 

Das Protokollierungsproblem

Das Erstellen eines Protokolls von Programmereignissen kann eine nützliche Methode sein, um schwierige Fehler zu erkennen - der Typ, der nur ab und zu auftritt. Wenn dieses Ereignis jedoch abstürzt, haben Sie das Problem: Löschen Sie das Protokoll nach jedem Aufruf auf die Festplatte, damit Sie Ereignisse sehen können Bis zum Absturz oder in einem Puffer aufbewahren und den Puffer regelmäßig leeren und hoffen, dass Sie beim Absturz nicht zu viel verlieren tritt ein?

07

von 08

Verwenden von Cin für die Eingabe: Formatierte Eingabe

Es gibt zwei Arten von Eingaben.

  • Formatiert. Eingabe als Zahlen oder eines bestimmten Typs lesen.
  • Unformatiert. Bytes lesen oder Saiten. Dies gibt eine viel größere Kontrolle über den Eingabestream.

Hier ist ein einfaches Beispiel für eine formatierte Eingabe.

 // excin_1.cpp: Definiert den Einstiegspunkt für die Konsolenanwendung. #include "stdafx.h" // Nur Microsoft. #umfassen Verwenden des Namespace std; int main (int argc, char * argv []) { int a = 0; float b = 0,0; int c = 0; cout << "Bitte geben Sie ein int, ein float und ein int ein, die durch Leerzeichen getrennt sind" <> a >> b >> c; cout << "Sie haben" << a << "" << b << "" << c << endl eingegeben; return 0; }

Dies verwendet cin, um drei Zahlen zu lesen (int, schweben, int) durch Leerzeichen getrennt. Sie müssen die Eingabetaste drücken, nachdem Sie die Nummer eingegeben haben.

3 7.2 3 gibt "Sie haben 3 7.2 3 eingegeben" aus.

Formatierte Eingabe hat Einschränkungen!

Wenn Sie 3,76 5 8 eingeben, erhalten Sie "Sie haben 3 0,76 5 eingegeben", alle anderen Werte in dieser Zeile gehen verloren. Das verhält sich richtig, wie die. ist nicht Teil des int und markiert so den Beginn des Floats.

Fehlerbehebung

Das cin-Objekt setzt ein Fehlerbit, wenn die Eingabe nicht erfolgreich konvertiert wurde. Dieses Bit ist Teil von ios und kann mit dem gelesen werden Scheitern() Funktion auf beiden cin und cout so was.

 if (cin.fail ()) // etwas tun. 

Nicht überraschend, cout.fail () wird selten eingestellt, zumindest bei der Bildschirmausgabe. In einer späteren Lektion zu Datei-E / A werden wir sehen, wie cout.fail () kann wahr werden. Da ist auch ein gut() Funktion für cin, cout etc.

instagram story viewer