Я хотел бы использовать средства, предоставленные stringstream
, для извлечения значений из фиксированного формата string
в качестве альтернативы безопасному типу sscanf
. Как я могу это сделать?
Рассмотрим следующий конкретный вариант использования. У меня есть std::string
в следующем фиксированном формате:
YYYYMMDDHHMMSSmmm
Где:
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)
Раньше я делал что-то в этом направлении:
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 );
Значения ширины - это магические числа, и это нормально. Я хотел бы использовать потоки для извлечения этих значений и преобразования их в unsigned
в интересах безопасности типов. Но когда я пробую это:
stringstream ss;
ss << "20101220110651184";
ss >> setw(4) >> year;
year
сохраняет значение 0
. Это должно быть 2010
.
Как мне делать то, что я пытаюсь сделать? Я не могу использовать Boost или любую другую стороннюю библиотеку, и я не могу использовать С++ 0x.