2010-07-01 7 views
7

Wenn ich die Ausgabe einen festen Breite Hexadezimalnummer mit 4 Ziffern auf einem Strom wollte, würde ich brauche so etwas wie dies zu tun:gibt es eine gute Möglichkeit, Stream Manipulatoren zu kombinieren?

cout << "0x" << hex << setw(4) << setfill('0') << 0xABC; 

die langatmig ein bisschen scheint. Mit einem Makro hilft:

#define HEX(n) "0x" << hex << setw(n) << setfill('0') 

cout << HEX(4) << 0xABC; 

Gibt es einen besseren Weg, um die Manipulatoren zu kombinieren?

+0

Auftrieb hat ein Ausgabeformat Bibliothek: siehe http://stackoverflow.com/questions/119098/which-io-library-do-you-use -in-your-c-code/119194 # 119194 –

Antwort

18

Vermeiden Sie die Makros, wenn Sie können! Sie verstecken Code, machen es schwer zu debuggen, respektieren den Gültigkeitsbereich usw.

Sie können eine einfache Funktion verwenden, wie KenE bereitgestellt. Wenn Sie alle Lust und flexibel erhalten möchten, dann können Sie Ihre eigenen Manipulator schreiben:

#include <iostream> 
#include <iomanip> 
using namespace std; 

ostream& hex4(ostream& out) 
{ 
    return out << "0x" << hex << setw(4) << setfill('0'); 
} 

int main() 
{ 
    cout << hex4 << 123 << endl; 
} 

Dieses es allgemeinere etwas macht. Der Grund für die obige Funktion ist, dass operator<< bereits wie folgt überladen ist: ostream& operator<<(ostream&, ostream& (*funtion_ptr)(ostream&)). endl und einige andere Manipulatoren sind ebenfalls so implementiert.

Wenn Sie die Anzahl der Stellen zulassen mögen zur Laufzeit festgelegt werden, wir eine Klasse verwenden können:

#include <iostream> 
#include <iomanip> 
using namespace std; 

struct formatted_hex 
{ 
    unsigned int n; 
    explicit formatted_hex(unsigned int in): n(in) {} 
}; 

ostream& operator<<(ostream& out, const formatted_hex& fh) 
{ 
    return out << "0x" << hex << setw(fh.n) << setfill('0'); 
} 

int main() 
{ 
    cout << formatted_hex(4) << 123 << endl; 
} 

Wenn die Größe kann jedoch bei der Kompilierung-Zeit bestimmt werden, könnte genauso gut einfach nutzen eine Funktion template [dank Jon Purdy für diesen Vorschlag]:

template <unsigned int N> 
ostream& formatted_hex(ostream& out) 
{ 
    return out << "0x" << hex << setw(N) << setfill('0'); 
} 

int main() 
{ 
    cout << formatted_hex<4> << 123 << endl; 
} 
+3

+1 Ich würde einen Manipulator einer freien Funktion vorziehen, da es die Absicht besser zu vermitteln scheint. Um es vollständig generisch zu machen, schreiben Sie es als Vorlage 'hex '. –

+0

@Jon guten Ruf! Ich habe den Beitrag dementsprechend bearbeitet, um das als eine Möglichkeit einzuschließen. – stinky472

+0

Ich glaube, was Sie in Ihrem ersten Beispiel eingegeben haben, funktioniert nicht. Sie müssen 'hex4 (cout) << 123 << endl;' schreiben. – rlbond

4

Warum ein Makro - können Sie nicht stattdessen eine Funktion verwenden?

void write4dhex(ostream& strm, int n) 
{ 
    strm << "0x" << hex << setw(4) << setfill('0') << n; 
} 
+0

+1 und keine Makros pls! KTHX – stinky472

Verwandte Themen