Ich arbeitete mit einigen Zeitfunktionen heute und bemerkte, dass die Standardkonvertierung mit %r
(oder %p
) scheint nicht für die Eingabe über std::get_time()
auf g ++ oder Clang ++ zu arbeiten. Siehe this live code version für g ++ und clang ++. Es scheint funktioniert wie erwartet unter Windows mit VC++ (siehe closely related question). Beachten Sie auch, dass der Effekt gleich ist, unabhängig davon, ob die Zeile imbue
enthalten ist oder nicht. Das Gebietsschema auf meinem Linux-Rechner ist auf "en_US.UTF-8"
eingestellt, wenn es darauf ankommt.Ist std :: get_time in g ++ und clang ++ gebrochen?
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <ctime>
int main(){
std::tm t{};
std::stringstream ss{"1:23:45 PM"};
ss.imbue(std::locale(std::cin.getloc(),
new std::time_get_byname<char>("en_US")));
ss >> std::get_time(&t, "%r");
if (ss.fail()) {
std::cout << "Conversion failed\n" << std::put_time(&t, "%r") << '\n';
} else {
std::cout << std::put_time(&t, "%r") << '\n';
}
}
Dies scheint ein Problem mit libstdC++ zu sein. Zusammenklang mit libC++ analysiert das gut. –
@HowardHinnant: Sie sind [rechts] (http://coliru.stacked-crooked.com/a/e597ffb8e4d4497e). Soll ich die Frage wiederholen? – Edward
Es sieht aus wie die [Implementierung] (https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/bits/locale_facts_nonio.tcc?revision=219012&view=markup&pathrev=219013#l654) behandelt nicht% r oder% p. Wenn es einen anderen Ort gibt, wo sie behandelt werden sollen, kann ich es nicht finden. – interjay