Namensräume
Varianten
Aktionen

std::time_get<CharT,InputIt>::get, std::time_get<CharT,InputIt>::do_get

Von cppreference.com
< cpp‎ | locale‎ | time get
 
 
 
 
 
Definiert in Header <locale>
public:

iter_type get( iter_type beg, iter_type end, std::ios_base& str,
               std::ios_base::iostate& err, std::tm* t,

               const char_type* fmtbeg, const char_type* fmtend ) const;
(1) (seit C++11)
protected:

virtual iter_type do_get( iter_type beg, iter_type end, std::ios_base& str,
                          std::ios_base::iostate& err, std::tm *t,

                          char format, char modifier ) const;
(2) (seit C++11)
1) Analysiert Datum und Uhrzeit aus der Eingabezeichensequenz [beg, end) gemäß dem im Zeichensequenz [fmtbeg, fmtend) angegebenen Format. Das Format soll dem unten beschriebenen Format folgen, obwohl die tatsächliche Verarbeitung jeder Formatangabe durch Überschreiben von 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):
a) Alle Zeichen aus dem Formatstring wurden gelesen (fmtbeg == fmtend).
b) Es gab einen Parsing-Fehler (err != std::ios_base::goodbit).
c) Alle Zeichen aus der Eingabesequenz wurden gelesen (beg == end. Wenn diese Bedingung die Schleife beendet, setzt die Funktion sowohl eofbit als auch failbit in err.
Im Körper der Schleife finden die folgenden Schritte statt:
a) Wenn das nächste Zeichen im Formatstring '%' ist, gefolgt von einem oder zwei Zeichen, die eine gültige std::get_time-Konvertierungsangabe bilden (siehe unten), werden diese Zeichen im Aufruf do_get(beg, end, str, err, t, format, modifier) verwendet, wobei format das primäre Konvertierungsangabezeichen und modifier der optionale Modifikator ist (der zwischen % 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.
b) Wenn das nächste Zeichen ein Leerzeichen ist, wie durch die im Stream str angegebene Locale angezeigt (d.h. std::isspace(*fmtbeg, str.getloc()) == true), behält die Funktion fmtbeg inkrementiert, bis er entweder gleich fmtend wird oder auf ein Nicht-Leerzeichen zeigt.
c) Wenn das nächste Zeichen im Formatstring dem nächsten Zeichen im Eingabestream gemäß einer Fall-unempfindlichen Vergleichung entspricht, verschiebt die Funktion beide Sequenzen um ein Zeichen ++fmtbeg, ++beg; und setzt die Schleife fort. Andernfalls setzt sie das failbit in err.
Analysiert eine Konvertierungsangabe aus der Eingabesequenz [beg, end) und aktualisiert die Struktur std::tm, auf die von t gezeigt wird, entsprechend.
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 failbit in err gesetzt. Wenn das Ende des Eingabestroms nach dem Lesen eines Zeichens erreicht wird, wird eofbit in err gesetzt. Wenn die Eingabezeichenfolge erfolgreich geparst wurde, werden die entsprechenden Felder von *t aktualisiert.
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 eofbit in err gesetzt und diese Felder bleiben in einem undefinierten Zustand.

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) [bearbeiten]