ShreevatsaR Ein Problem bei der Wiederherstellung von dec über hex ist, dass dec möglicherweise nicht der zuvor eingestellte Wert gewesen ist, vor allem, wenn Sie eine allgemeine Bibliotheksmethode schreiben. Diese Frage hat einige Antworten über das Speichern und Wiederherstellen Zustand. Sie können den Zustand mit ios :: fmtflags f (cout. flags ()) speichern und mit out. flags (f) wiederherstellen. Ndash jtpereyda Jan 8 15 am 0:09 Ich denke, das Verhalten dieses Codes ist undefiniert. Das setf löscht die ios :: basefield-Bits, einschließlich ios :: dec (Standard für Standardströme) und setzt nur ios :: hex. Wenn ios :: hex deaktiviert ist, wird jedes Bit in ios :: basefield deaktiviert. Wie es num gedruckt zum zweiten Mal Beweis, dass die Bits sind alle unset: ideone / fYXyh6. Dies ist für ios :: floatfield nach Thinking in C vol 2 page 189 erlaubt, aber es sagt nicht dasselbe über ios :: basefield. Ndash Joel Sj246gren Wenn Sie eine einzelne Hexadezimalzahl drucken und dann zurück zur Dezimalzahl zurückkehren möchten, können Sie dieses verwenden: std :: cout ltlt std :: hex ltlt num ltlt std :: dec ltlt std: : Endl13.7 Manipulatoren Manipulatoren sind Werte, die Sie in iostreams einfügen oder extrahieren können, um spezielle Effekte zu haben. Parametrierte Manipulatoren sind Manipulatoren, die einen oder mehrere Parameter annehmen. Da Manipulatoren gewöhnliche Bezeichner sind und daher mögliche Namen verwenden, definiert iostream sie für jede mögliche Funktion. Eine Reihe von Manipulatoren werden mit Elementfunktionen in anderen Teilen dieses Kapitels besprochen. Es gibt 13 vordefinierte Manipulatoren, wie in Tabelle 16013-2 beschrieben. Wenn Sie diese Tabelle verwenden, gehen Sie wie folgt vor: istr ist ein Eingabestrom. Um vordefinierte Manipulatoren zu verwenden, müssen Sie die Datei iomanip. h in Ihr Programm aufnehmen. Sie können eigene Manipulatoren definieren. Es gibt zwei grundlegende Arten von Manipulator: Plain Manipulator8212Takes ein istream38. Ostream38. Oder ios38-Argument, arbeitet auf dem Stream und gibt dann sein Argument zurück. Parametrierter Manipulator8212Nach einer istream38. Ostream38. Oder ios38-Argument, ein zusätzliches Argument (der Parameter), arbeitet auf dem Stream und gibt dann seine Stream-Argument zurück. 13.7.1 Verwenden von einfachen Manipulatoren Ein einfacher Manipulator ist eine Funktion, die: eine Referenz auf einen Stream annimmt. Funktioniert auf irgendeine Weise zurück Gibt das Argument zurück Die Schiebeoperatoren, die eine solche Funktion (einen Zeiger auf) aufnehmen, sind für iostreams vordefiniert. So dass die Funktion in einer Sequenz von Eingabe - oder Ausgabeoperatoren gesetzt werden kann. Der Shift-Operator ruft die Funktion an, anstatt zu versuchen, einen Wert zu lesen oder zu schreiben. Ein Beispiel für einen Registerkartenmanipulator, der eine Registerkarte in einen Ostream einfügt, ist: Dies ist ein aufwendiger Weg, um Folgendes zu erreichen: Der folgende Code ist ein weiteres Beispiel, das mit einer einfachen Konstanten nicht erreicht werden kann. Angenommen, Sie möchten den Whitespace skippi ng ein - und ausschalten. Sie können separate Aufrufe zu ios :: setf und ios :: unsetf verwenden, um das skipws-Flag ein - und auszuschalten, oder Sie können zwei Manipulatoren definieren. 13.7.2 Parametrierte Manipulatoren Einer der parametrierten Manipulatoren, der in iomanip. h enthalten ist, wird gesetzt. Setfill legt das Zeichen fest, das zum Ausfüllen von Feldbreiten verwendet wird. Es ist wie im folgenden Beispiel dargestellt implementiert: Ein parametrierter Manipulator ist in zwei Teile implementiert: Der Manipulator. Es benötigt einen zusätzlichen Parameter. Im vorherigen Codebeispiel wird ein zusätzlicher int-Parameter benötigt. Sie können diese Manipulatorfunktion nicht in einer Sequenz von Eingabe - oder Ausgabeoperationen platzieren, da für sie kein Shift-Operator definiert ist. Stattdessen müssen Sie eine Hilfsfunktion, den Applikator, verwenden. Die Bewerbung. Er ruft den Manipulator auf. Der Applikator ist eine globale Funktion, und Sie stellen einen Prototyp dafür in einer Header-Datei zur Verfügung. Normalerweise ist der Manipulator eine statische Funktion in der Datei, die den Quellcode für den Applikator enthält. Der Manipulator wird nur vom Applikator aufgerufen, und wenn Sie ihn statisch machen, behalten Sie seinen Namen aus dem globalen Adressraum heraus. In der Header-Datei iomanip. h sind mehrere Klassen definiert. Jede Klasse enthält die Adresse einer Manipulatorfunktion und den Wert eines Parameters. Die iomanip-Klassen werden in der Manpage manip (3CC4) beschrieben. Das vorherige Beispiel verwendet die smanipint-Klasse, die mit einem ios arbeitet. Weil es mit einem ios funktioniert. Es funktioniert auch mit einem Istream und einem Ostream. Das vorherige Beispiel verwendet auch einen zweiten Parameter vom Typ int. Der Applikator erstellt und gibt ein Klassenobjekt zurück. Im obigen Codebeispiel ist das Klassenobjekt ein Smanipint. Und sie enthält den Manipulator und das int-Argument für den Applikator. Die iomanip. h-Headerdatei definiert die Schiebeoperatoren für diese Klasse. Wenn die Applikatorfunktion setfill in einer Sequenz von Eingabe - oder Ausgabeoperationen auftritt, wird die Applikatorfunktion aufgerufen und eine Klasse zurückgegeben. Der Schichtoperator wirkt auf die Klasse, um die Manipulatorfunktion mit ihrem Parameterwert aufzurufen. Die in der Klasse gespeichert wird. Im folgenden Beispiel wird der Manipulator printhex: Legt den Ausgabe-Stream in den Hex-Modus. Fügt einen langen Wert in den Stream ein. Stellt den Konvertierungsmodus des Streams wieder her. Die Klasse omaniplong wird verwendet, weil dieses Codebeispiel nur für die Ausgabe ausgegeben wird und es auf einem langen statt einem int arbeitet: Ausgabeformatierung Viele Studenten beschweren sich, dass C-Streams im Vergleich zu den älteren C-Methoden nur schwer für die Ausgabe zu verwenden sind. Meine Theorie ist, dass, wenn die Situation umgekehrt und die Schüler waren erforderlich, um von C-Stream Formatierung zurück zu den alten Methoden, die Beschwerden wäre lauter. Der größte einzelne Vorteil zu den Strommethoden ist sie typsicher. Wenn Sie einen Variablentyp ändern, werden die nachfolgenden Stream-Operationen, die diese Variable verwenden, entweder automatisch die Änderung unterbringen oder eine Kompatibilität zur Kompilierzeit anzeigen. In älteren C-Code, eine beliebige Anzahl von schwer zu erkennen Bugs resultieren entweder falsch spezifiziert einen Variablen-Typ, oder Ändern der Variablen-Typ und nicht daran erinnern, alle Orte, an denen die Spezifizierer geändert werden müssen. Bitte denken Sie daran mdash Dies ist eine sehr grundlegende Einführung. Wie dieses gesamte Tutorial, ist diese Seite nicht ein umfassender Leitfaden für Stream-Formatierung mdash es beantwortet nur die am häufigsten gestellte Fragen der Schüler. Ein Qualitätslehrbuch sollte erworben werden, um allgemeineren Bedürfnissen zu dienen. Die Einstellung der Feldbreite ist sehr einfach. Fügen Sie jeder Variablen einfach setw (n) voran. So wie folgt: Beachten Sie, wie setw (n) die Feldbreite steuert, sodass jede Zahl innerhalb eines Feldes gedruckt wird, das unabhängig von der Breite der Zahl die gleiche Breite hat. 2. Begründung in Feld Nachdem Sie ein Feld ausgewählt haben, können Sie entscheiden, welche Seite dieses Feldes zu besetzen ist. Wie Sie sich vorstellen können, sind die Entscheidungen links und rechts. Hier ist ein Beispiel für schaltende Rechtfertigung zeilenweise: Da Zahlen standardmäßig rechtsbündig sind, muss ich in diesem Fall nur das ios :: left-Flag setzen und deaktivieren. In anderen Situationen können Sie ios :: rechts im Code ähnlich zu verwenden. Leider gibt es zwei Flags, ios :: left und ios :: right. Dies führt zu einer offensichtlichen Verwirrung darüber, welche Flagge aktiv ist. In einigen zweideutigen Fällen müssen Sie dies tun: 3. Steuern von Precision Precision bedeutet in diesem Zusammenhang die Anzahl der Nachkommastellen in einer Gleitkomma-Variablen. Kompilieren und führen Sie das folgende Programm: Dieses Programm ist nicht gebrochen mdash Sie gefragt, für zwei Orte, druckte er zwei Orte. Wenn Sie stattdessen zwei Dezimalstellen (Positionen rechts vom Dezimalpunkt) wünschen, müssen Sie zuerst das Festkommaformat wählen. Wie dies: Dies ist ein sehr häufiges Student Problem mdash die Standard-C-Stream Verhalten für setprecision (n) ist es, die Spezifikation auf die gesamte Zahl, nicht die Bruchteil. Sollte dies nicht der Fall sein, setzen Sie zuerst das Fixpunktformat. Es gibt etwas sehr Wichtiges zu wissen über setprecision (n). Wenn Sie eine Präzision auf diese Weise wählen, wird die angezeigte Zahl entsprechend abgerundet. Experimentieren Sie mit dem folgenden Programm: Das Ergebnis (.6667) ist eine geeignete vierstellige Darstellung des Wiederholungsdezimalteils 2/3. Wenn Sie dieses Verhalten nicht möchten, müssen Sie eine andere Methode für die Anzeige zu denken. In den meisten Fällen ist das Standardverhalten das richtige. 4. Führende Nullen Die C-Stream-Klassen bieten eine einfache Möglichkeit, ein Zeichen zu wählen, um die führenden Felder in einer Zahl zu füllen (und dieses Programm hat einen absichtlichen Fehler): Der Fehler (kein führender Charakter im Monat) wird durch die Tatsache verursacht, dass Setw (n) ist flüchtig. Setw (n) funktioniert nur für eine einzelne nachfolgende Variable. Sie müssen für jede Variable setw (n) anwenden. Führen Sie es auf diese Weise aus: 5. Anzahl Basen außer 10 Für Basis 8 und Basis 16 ist dies ein einfaches Problem zu lösen: By the way, diese Stream-Formatierung für verschiedene Basen funktioniert auch für die Eingabe: Es gibt keine allgemeine willkürliche Basis-Anzeige Lösung in die Sprache eingebaut. Hier ist ein Beispiel für eine Lösung: 6. Währung Dies ist ein fortgeschrittenes Thema, weil das Anzeigen von Währung komplexer ist, als es auf den ersten Blick erscheinen mag. Es gibt eine erweiterte C-Feature namens locale, die dieses Problem in einer leistungsfähigen Weise behandeln kann, aber es ist nicht auf vielen Compilern aktiviert (und noch nicht auf dem sehr häufigen Compiler habe ich für dieses Tutorial gewählt). Hier ist ein Weg, um Währung anzuzeigen: Dieser Ansatz hat viele Nachteile. Ich habe das Doppelte zu einem unsigned lange vor Beginn meines Algorithmus umgewandelt, der die Strecke der möglichen Währungsbeträge begrenzt. Versuchen Sie, mit diesem Code mdash-Test die verschiedenen Aussagen zu sehen, wie sie funktionieren. Und wenn Sie ehrgeizig sind, sehen Sie, wenn Sie eine doppelte Arbeit direkt zu machen, ohne Umwandlung in eine vorzeichenlose lange erste (und viel Glück :)). Beachten Sie auch das width-Argument für showCurrency (). Beachten Sie, dass es einen Vorgabewert gegeben wird, der es unnötig macht, sogar einen Wert anzugeben, wenn die Funktion aufgerufen wird. Diese Standard-Argument-Syntax ist eine Standardfunktion von C. Wenn Sie eine andere Breite als 14 haben möchten, können Sie Ihren eigenen Wert in Ihren Aufruf zur Funktion aufnehmen. Wie dies: 7. Verständnis Diese Seite hat eine Reihe von ziemlich komplexen Beispielen. Lesen Sie nicht einfach diese Seite und gehen Sie weiter. Achten Sie darauf, zu kompilieren und führen Sie die Beispiele, und experimentieren mit ihnen zu. Verwenden Sie alle Lehrbücher, die Sie zum Verständnis der angezeigten Methoden hinzufügen müssen. Und wenn Sie nicht verstehen, die Beispiele, nicht weiter. Diese Seiten sind Copyright-Kopie 2000, P. Lutus. Alle Rechte vorbehalten.
No comments:
Post a Comment