std::time_get<CharT,InputIt>::get, std::time_get<CharT,InputIt>::do_get
| Definiert in Header <locale> |
||
| public: iter_type get( iter_type beg, iter_type end, std::ios_base& str, |
(1) | (seit C++11) |
| protected: virtual iter_type do_get( iter_type beg, iter_type end, std::ios_base& str, |
(2) | (seit C++11) |
do_get angepasst werden kann. Die Funktion get führt Folgendes aus: Zuerst werden die Fehlerbits in err gelöscht, indem err = std::ios_base::goodbit ausgeführt wird. Dann wird eine Schleife gestartet, die terminiert, sobald eine der folgenden Bedingungen wahr wird (in dieser Reihenfolge geprüft):eofbit als auch failbit in err.- Im Körper der Schleife finden die folgenden Schritte statt:
% und dem Formatzeichen erscheint, falls vorhanden). Wenn kein Modifikator vorhanden ist, wird der Wert '\0' verwendet. Wenn der Formatstring mehrdeutig ist oder zu früh endet, um die Konvertierungsangabe nach '%' zu bestimmen, wird eofbit in err gesetzt und die Schleife beendet. Wenn nach dem Aufruf von do_get keine Fehlerbits in err gesetzt sind, inkrementiert die Funktion fmtbeg, sodass er direkt nach der Konvertierungsangabe zeigt, und die Schleife wird fortgesetzt.failbit in err.- Zuerst werden die Fehlerbits in err durch Ausführen von err = std::ios_base::goodbit gelöscht. Dann werden Zeichen aus der Eingabesequenz [beg, end) gelesen, die von der std::time_get-Formatangabe erwartet werden, die durch Kombinieren von '%', modifier (falls nicht '\0') und format gebildet wird. Wenn die Zeichen keine gültige Konvertierungsangabe bilden, wird
failbitin err gesetzt. Wenn das Ende des Eingabestroms nach dem Lesen eines Zeichens erreicht wird, wirdeofbitin err gesetzt. Wenn die Eingabezeichenfolge erfolgreich geparst wurde, werden die entsprechenden Felder von *t aktualisiert.
- Zuerst werden die Fehlerbits in err durch Ausführen von err = std::ios_base::goodbit gelöscht. Dann werden Zeichen aus der Eingabesequenz [beg, end) gelesen, die von der std::time_get-Formatangabe erwartet werden, die durch Kombinieren von '%', modifier (falls nicht '\0') und format gebildet wird. Wenn die Zeichen keine gültige Konvertierungsangabe bilden, wird
- Bei komplexen Konvertierungsangaben wie '%x' oder '%c' oder den Direktiven, die die Modifikatoren 'E' und 'O' verwenden, kann die Funktion möglicherweise nicht alle Werte bestimmen, die in *t gespeichert werden sollen. In diesem Fall wird
eofbitin err gesetzt und diese Felder bleiben in einem undefinierten Zustand.
- Bei komplexen Konvertierungsangaben wie '%x' oder '%c' oder den Direktiven, die die Modifikatoren 'E' und 'O' verwenden, kann die Funktion möglicherweise nicht alle Werte bestimmen, die in *t gespeichert werden sollen. In diesem Fall wird
Inhalt |
[bearbeiten] Parameter
| beg | - | Iterator, der den Anfang der zu analysierenden Sequenz bezeichnet |
| end | - | Iterator, der auf ein Element nach dem Ende der zu analysierenden Sequenz zeigt |
| str | - | Ein Stream-Objekt, das diese Funktion verwendet, um Locale-Facets bei Bedarf zu erhalten, z. B. std::ctype zum Überspringen von Leerzeichen oder std::collate zum Vergleichen von Zeichenketten |
| err | - | Objekt für Stream-Fehlerflags, das von dieser Funktion modifiziert wird, um Fehler anzuzeigen |
| t | - | Zeiger auf das std::tm-Objekt, das das Ergebnis dieses Funktionsaufrufs speichern wird |
| fmtbeg | - | Zeiger auf das erste Zeichen einer Sequenz von char_type-Zeichen, die das Konvertierungsformat angeben (siehe unten) |
| fmtend | - | Zeiger auf das Zeichen nach dem letzten Zeichen einer Sequenz von char_type-Zeichen, die das Konvertierungsformat angeben |
| format | - | das Zeichen, das eine Konvertierungsangabe benennt |
| modifier | - | der optionale Modifikator, der zwischen % und der Konvertierungsangabe stehen kann |
Der Formatstring besteht aus null oder mehr Konvertierungsangaben, Leerzeichen und gewöhnlichen Zeichen (außer %). Jedes gewöhnliche Zeichen soll einem Zeichen im Eingabestrom in einer Fall-unempfindlichen Vergleichung entsprechen. Jedes Leerzeichen entspricht beliebigen Leerzeichen in der Eingabezeichenfolge. Jede Konvertierungsangabe beginnt mit einem %-Zeichen, optional gefolgt von einem E- oder O-Modifikator (ignoriert, wenn von der Locale nicht unterstützt), gefolgt von dem Zeichen, das das Verhalten der Angabe bestimmt. Die Formatangaben entsprechen der POSIX-Funktion strptime()
| Konversion Spezifizierer |
Erklärung | Schreibt in Felder |
|---|---|---|
%
|
entspricht einem literalen %. Die vollständige Konvertierungsangabe muss %% sein |
(keine) |
t
|
entspricht einem beliebigen Leerzeichen | (keine) |
n
|
entspricht einem beliebigen Leerzeichen | (keine) |
| Jahr | ||
Y
|
analysiert das vollständige Jahr als 4-stellige Dezimalzahl, führende Nullen sind erlaubt, aber nicht erforderlich | tm_year
|
EY
|
analysiert das Jahr in der alternativen Darstellung, z.B. 平成23年 (Jahr Heisei 23), was 2011 in tm_year in der Locale ja_JP schreibt | tm_year
|
y
|
analysiert die letzten 2 Ziffern des Jahres als Dezimalzahl. Bereich [69,99] ergibt die Werte 1969 bis 1999, Bereich [00,68] ergibt 2000-2068 |
tm_year
|
Oy
|
analysiert die letzten 2 Ziffern des Jahres unter Verwendung des alternativen Zahlensystems, z.B. 十一 wird in der Locale ja_JP als 11 analysiert | tm_year
|
Ey
|
analysiert das Jahr als Offset vom alternativen Kalenderzeitraum der Locale %EC |
tm_year
|
C
|
analysiert die ersten 2 Ziffern des Jahres als Dezimalzahl (Bereich [00,99]) |
tm_year
|
EC
|
analysiert den Namen des Basisjahres (Zeitraum) in der alternativen Darstellung der Locale, z.B. 平成 (Ära Heisei) in ja_JP | tm_year
|
| Monat | ||
b
|
analysiert den Monatsnamen, entweder vollständig oder abgekürzt, z.B. Oct |
tm_mon
|
h
|
Synonym von b |
tm_mon
|
B
|
Synonym von b |
tm_mon
|
m
|
analysiert den Monat als Dezimalzahl (Bereich [01,12]), führende Nullen sind erlaubt, aber nicht erforderlich |
tm_mon
|
Om
|
analysiert den Monat unter Verwendung des alternativen Zahlensystems, z.B. 十二 wird in der Locale ja_JP als 12 analysiert | tm_mon
|
| Week | ||
U
|
analysiert die Kalenderwoche als Dezimalzahl (Sonntag ist der erste Tag der Woche) (Bereich [00,53]), führende Nullen sind erlaubt, aber nicht erforderlich |
tm_year, tm_wday, tm_yday |
OU
|
analysiert die Kalenderwoche, wie bei %U, unter Verwendung des alternativen Zahlensystems, z.B. 五十二 wird in der Locale ja_JP als 52 analysiert |
tm_year, tm_wday, tm_yday |
W
|
analysiert die Kalenderwoche als Dezimalzahl (Montag ist der erste Tag der Woche) (Bereich [00,53]), führende Nullen sind erlaubt, aber nicht erforderlich |
tm_year, tm_wday, tm_yday |
OW
|
analysiert die Kalenderwoche, wie bei %W, unter Verwendung des alternativen Zahlensystems, z.B. 五十二 wird in der Locale ja_JP als 52 analysiert |
tm_year, tm_wday, tm_yday |
| Tag des Jahres/Monats | ||
j
|
analysiert den Jahrestag als Dezimalzahl (Bereich [001,366]), führende Nullen sind erlaubt, aber nicht erforderlich |
tm_yday
|
d
|
analysiert den Tag des Monats als Dezimalzahl (Bereich [01,31]), führende Nullen sind erlaubt, aber nicht erforderlich |
tm_mday
|
Od
|
analysiert den Tag des Monats unter Verwendung des alternativen Zahlensystems, z.B. 二十七 wird in der Locale ja_JP als 27 analysiert, führende Nullen sind erlaubt, aber nicht erforderlich | tm_mday
|
e
|
Synonym von d |
tm_mday
|
Oe
|
Synonym von Od |
tm_mday
|
| Wochentag | ||
a
|
analysiert den Namen des Wochentags, entweder vollständig oder abgekürzt, z.B. Fri |
tm_wday
|
A
|
Synonym von a |
tm_wday
|
w
|
analysiert den Wochentag als Dezimalzahl, wobei Sonntag 0 ist (Bereich [0-6]) |
tm_wday
|
Ow
|
analysiert den Wochentag als Dezimalzahl, wobei Sonntag 0 ist, unter Verwendung des alternativen Zahlensystems, z.B. 二 wird in der Locale ja_JP als 2 analysiert |
tm_wday
|
| Stunde, Minute, Sekunde | ||
H
|
analysiert die Stunde als Dezimalzahl, 24-Stunden-Uhr (Bereich [00-23]), führende Nullen sind erlaubt, aber nicht erforderlich |
tm_hour
|
OH
|
analysiert die Stunde aus der 24-Stunden-Uhr unter Verwendung des alternativen Zahlensystems, z.B. 十八 wird in der Locale ja_JP als 18 analysiert | tm_hour
|
I
|
analysiert die Stunde als Dezimalzahl, 12-Stunden-Uhr (Bereich [01,12]), führende Nullen sind erlaubt, aber nicht erforderlich |
tm_hour
|
OI
|
analysiert die Stunde aus der 12-Stunden-Uhr unter Verwendung des alternativen Zahlensystems, z.B. 六 wird in der Locale ja_JP als 06 gelesen | tm_hour
|
M
|
analysiert die Minute als Dezimalzahl (Bereich [00,59]), führende Nullen sind erlaubt, aber nicht erforderlich |
tm_min
|
OM
|
analysiert die Minute unter Verwendung des alternativen Zahlensystems, z.B. 二十五 wird in der Locale ja_JP als 25 analysiert | tm_min
|
S
|
analysiert die Sekunde als Dezimalzahl (Bereich [00,60]), führende Nullen sind erlaubt, aber nicht erforderlich |
tm_sec
|
OS
|
analysiert die Sekunde unter Verwendung des alternativen Zahlensystems, z.B. 二十四 wird in der Locale ja_JP als 24 analysiert | tm_sec
|
| Sonstiges | ||
c
|
analysiert die Standard-Datums- und Uhrzeitzeichenfolge der Locale, z.B. Sun Oct 17 04:41:13 2010 (Locale-abhängig) |
all |
Ec
|
analysiert die alternative Datums- und Uhrzeitzeichenfolge der Locale, z.B. erwartet平成23年 (Jahr Heisei 23) anstelle von 2011年 (Jahr 2011) in der Locale ja_JP | all |
x
|
analysiert die Standard-Datumsdarstellung der Locale | all |
Ex
|
analysiert die alternative Datumsdarstellung der Locale, z.B. erwartet 平成23年 (Jahr Heisei 23) anstelle von 2011年 (Jahr 2011) in der Locale ja_JP | all |
X
|
analysiert die Standard-Zeitdarstellung der Locale | all |
EX
|
analysiert die alternative Zeitdarstellung der Locale | all |
D
|
entspricht "%m / %d / %y " | tm_mon, tm_mday, tm_year |
r
|
analysiert die Standard-12-Stunden-Uhrzeit der Locale (in POSIX, "%I : %M : %S %p") | tm_hour, tm_min, tm_sec |
R
|
entspricht "%H : %M" | tm_hour, tm_min |
T
|
entspricht "%H : %M : %S" | tm_hour, tm_min, tm_sec |
p
|
analysiert das Äquivalent von a.m. oder p.m. der Locale | tm_hour
|
Hinweis: tm_isdst wird nicht geschrieben und muss explizit gesetzt werden, um mit Funktionen wie mktime verwendet zu werden
[bearbeiten] Rückgabewert
Iterator, der auf das Zeichen nach dem letzten Zeichen in [beg, end) zeigt, das erfolgreich geparst wurde.
[bearbeiten] Anmerkungen
Für den Fall-unempfindlichen Vergleich der Nicht-Leerzeichen- und Nicht-%-Zeichen im Formatstring wird typischerweise, aber nicht notwendigerweise, die std::collate-Facet der von str bereitgestellten Locale verwendet.
Wenn ein Parsing-Fehler auftritt, lassen viele Implementierungen dieser Funktion *t völlig unberührt.
Es ist nicht spezifiziert, ob diese Funktionen die Felder in *t, die sie nicht direkt setzen, auf Null setzen: portable Programme sollten jedes Feld vor dem Aufruf von get() auf Null initialisieren.
[bearbeiten] Beispiel
#include <iomanip> #include <iostream> #include <locale> #include <sstream> int main() { std::istringstream ss("2026-März-12 23:45:56"); ss.imbue(std::locale("de_DE.utf8")); auto& f = std::use_facet<std::time_get<char>>(ss.getloc()); std::tm t{}; std::string s = "%Y-%b-%d %H:%M:%S"; std::ios_base::iostate err = std::ios_base::goodbit; auto ret = f.get({ss}, {}, ss, err, &t, &s[0], &s[0] + s.size()); ss.setstate(err); std::istreambuf_iterator<char> last{}; if (ss) { std::cout << "Successfully parsed as " << std::put_time(&t, "%c") << '\n'; if (ret != last) { std::cout << "Remaining content: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } else std::cout << "The input was fully consumed."; } else { std::cout << "Parse failed.\nUnparsed string: "; std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout)); } std::cout << '\n'; }
Ausgabe
Successfully parsed as Sun Mar 12 23:45:56 2026 The input was fully consumed.
[bearbeiten] Siehe auch
| (C++11) |
Parst einen Datums-/Zeitwert nach dem angegebenen Format (Funktion-Template) |