Chciałbym użyć obiektów dostarczonych przez stringstream
, aby wyodrębnić wartości ze stałego formatu string
jako bezpieczną dla rodzaju alternatywę dla sscanf
. Jak mogę to zrobić?Używanie strumienia łańcuchów zamiast `sscanf` do parsowania łańcucha o stałym formacie
Rozważmy następujący konkretny przypadek użycia. Mam std::string
w następującym ustalonym formacie:
YYYYMMDDHHMMSSmmm
Gdzie:
YYYY = 4 digits representing the year
MM = 2 digits representing the month ('0' padded to 2 characters)
DD = 2 digits representing the day ('0' padded to 2 characters)
HH = 2 digits representing the hour ('0' padded to 2 characters)
MM = 2 digits representing the minute ('0' padded to 2 characters)
SS = 2 digits representing the second ('0' padded to 2 characters)
mmm = 3 digits representing the milliseconds ('0' padded to 3 characters)
Wcześniej robiłem coś wzdłuż tych linii:
string s = "20101220110651184";
unsigned year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0, milli = 0;
sscanf(s.c_str(), "%4u%2u%2u%2u%2u%2u%3u", &year, &month, &day, &hour, &minute, &second, &milli);
Wartości szerokości są magiczne numery , i to jest w porządku. Chciałbym użyć strumieni, aby wyodrębnić te wartości i przekonwertować je na unsigned
sw interesie bezpieczeństwa typu. Ale gdy próbuję to:
stringstream ss;
ss << "20101220110651184";
ss >> setw(4) >> year;
year
zachowuje wartość 0
. Powinno to być 2010
.
Jak zrobić to, co próbuję zrobić? Nie mogę używać Boost ani żadnej innej biblioteki 3rd party, ani używać C++ 0x.
* Bill nie może czekać na jego kopii "Standard C++ iostreams i locales" ... +1 –
'setw() 'służy do zapisu danych wyjściowych. To nie działa w przypadku czytania. – marcog
Może powinieneś wrócić do początku strumienia przed wyodrębnieniem pierwszego pola. –