2010-12-18 17 views
10

Bei Verwendung von scanf() und seinen Varianten akzeptiert der Formatspezifizierer %i Daten als hexadezimale (Präfix "0x"), oktale (Präfix "0") oder Dezimalzahl (kein Präfix), also beispielsweise die Strings "0x10" "020" und "16" werden alle in eine ganze Zahl mit Dezimalwert 16 konvertiert.Kann `std :: istreamream :: operator >>()` ganzzahlige Radix-Präfixe wie stdios% i Formatspezifizierer akzeptieren?

Kann dies mit std::istream::operator>> formatiertem Eingang geschehen?

mit Normalpapier >> i ohne I/O-Manipulator „0x10“ auf Null umgewandelt wird (oder eher die führenden 0 ist, wird das „x10“ -Teil nicht verarbeitet), und „020“ bis 20. Die hex, oct und dec Manipulatoren verhalten sich wie %x, %o bzw. %d. Ich suche nach einem allgemeinen Ganzzahleingabe-Manipulator, der wie %i funktioniert.

Interessanterweise akzeptiert der hex Manipulator sowohl "0x10" als auch "10", um entweder auf 16 Dezimalstellen umzurechnen.

Für den Fall, dass Sie sich wundern, ich bin ein Ausdruck Evaluator implementieren, und ich möchte, dass Integer Operanden Hex, Oktal oder Dezimal mit der C/C++ Präfix Konvention. Die aktuelle Implementierung, die sscanf() verwendet, tut dies automatisch mit %i, und ich bin neugierig, ob dies geändert werden könnte, um Iostream zu verwenden, ohne das numerische Format explizit analysieren zu müssen.

+0

Interessante E. +1. Ich frage mich, ob das Buch C++ IOStreams und Locales solche Sachen hat ... –

+0

Da ich mir fast 100% sicher bin, dass es kein direktes Äquivalent gibt, glaube ich, dass die neuste und am besten inhaltende Lösung darin besteht, einen neuen Manipulator der Form zu implementieren 'std :: ios_base & integer (std :: ios_base & str);' – Clifford

+0

@Johannes hat die Antwort, die auch die Mittel zur Implementierung des obigen Manipulators bietet. – Clifford

Antwort

10

Das Basisfeld in den Formatflags von basic_istream schreibt vor, wie Zahlen zu interpretieren sind. Das Feld kann auf dec, oct und hex eingestellt werden. Standardmäßig ist es auf dec eingestellt. Wenn es zu keiner von ihnen festgelegt ist, wird basic_istream verhalten sich wie scanf ‚s %i Flagge:

// automatically detect the base, depending on prefix 
std::cin.unsetf(std::ios_base::basefield); 
+0

Genie. Jetzt sehe ich, wie es gemacht wird, es ist viel einfacher, die Dokumentation zu finden, die Ihnen sagt, wie! z. B .: http://stdcxx.apache.org/doc/stdlibug/28-3.html – Clifford