2017-09-07 1 views
0

Warumiomanip/feste Breite Persistenz

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    std::cout << std::fixed << std::setw(4) << std::setprecision(0); 
    std::cout << 4; 
    std::cout << 4; 
} 

Druck

" 44 

(das Zitat ignorieren, es ist nur die Formatierung richtig zu machen) und nicht

" 4 4 

?

Ich dachte, dass die Iostream 'Modifikatoren' im Stream persistent sind, bis sie explizit geändert/zurückgesetzt werden. Ich habe eine Reihe von Zahlen, die ich mit einem bestimmten Präfix drucken muss, damit alle Felder die gleiche Breite haben; Sollte ich meine Modifikatoren jedes Mal erneut anwenden, wenn ich einen drucke? Scheint nicht sehr effizient.

+1

Einige Modifier sind persistent und andere nicht, ob es effizient ist oder nicht, ist jetzt irrelevant, da es nicht mehr geändert werden kann. –

Antwort

3

Leider sind Sie in einen der Bereiche des Standards gewandert, der ein wenig archaisch und scheinbar ohne übergeordnete Designziele ist.

Dies ist zweifellos historisch wie die Iostreams-Bibliothek AFAIAA, war ursprünglich nicht Teil der STL, die die Standard-Bibliothek wurde.

Es lohnt sich, die Notizen zu allen std::ios_base Mitgliedern und den zugehörigen Manipulatoren zu lesen.

Zum Beispiel:

http://en.cppreference.com/w/cpp/io/ios_base/width

Einige E/A-Funktionen aufrufen Breite (0) vor der Rückkehr finden Sie std :: setw (dies führt in diesem Bereich auf der nächsten I Wirkung/O einzige Funktion, und nicht auf irgendeiner nachfolgenden I/O)

die genauen Auswirkungen dieser Modifikator auf der Ein- und Ausgabe zwischen den einzelnen I/O-Funktionen variieren und hat an jedem Operator < < und Operator >> Überlastseite einzeln beschrieben .

Im Vorgriff auf:

Aber das ist nur < Einsatz expletive > !!!

A: yup.

+0

Oh, richtig, ich dachte, ich hätte gerade etwas vermisst. Vielen Dank. – Roel

+0

Eine zusätzliche Frage vielleicht: ist es möglich, meine eigene Version von setw() (sagen wir, setw_persistent()), die Breite (0) nicht aufrufen? Ich meine, es würde bedeuten, eine benutzerdefinierte Überladung für << wie hier beschrieben https://stackoverflow.com/questions/29337774/how-are-iomanip-functions-implementiert machen, aber ich meine, was tut die Überladung für setw() tun auf dem Strom? – Roel

+0

@Roel Wenn es sich lohnte herumzuspielen, hätten klügere Leute als du oder ich es bereits im Boost gegeben. Es ist nur eines dieser Dinge, die es nicht wert sind, Zeit zu verschwenden. Besser, einfach die Oberfläche zu lernen und diese zu benutzen - oder etwas ausdrucksvolleres zu verwenden, wie boost :: format, was ich sehr empfehlen kann. Ich denke, dass das ganze Streaming-Operator-Ding vor vielen Jahren schlecht geplant war, bevor die Leute es besser wussten. –