Me gustaría utilizar las facilidades proporcionadas por stringstream
para extraer valores de un formato fijo string
como una alternativa de tipo seguro a sscanf
. ¿Cómo puedo hacer esto?Usar stringstream en lugar de `sscanf` para analizar una cadena de formato fijo
Considere el siguiente caso de uso específico. Tengo un std::string
en el siguiente formato fijo:
YYYYMMDDHHMMSSmmm
Dónde:
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)
Anteriormente yo estaba haciendo algo en este sentido:
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);
Los valores de anchura son números mágicos y está bien Me gustaría utilizar transmisiones para extraer estos valores y convertirlos a unsigned
s en aras de la seguridad del tipo. Pero cuando intento esto:
stringstream ss;
ss << "20101220110651184";
ss >> setw(4) >> year;
year
conserva el valor 0
. Debe ser 2010
.
¿Cómo hago lo que estoy tratando de hacer? No puedo usar Boost ni ninguna otra biblioteca de terceros, ni puedo usar C++ 0x.
* Bill no puede esperar a que su copia de "estándar de C++ iostreams y Locales" ... 1 –
'setw() 'es para escribir salida. No funciona para leer en. – marcog
Tal vez debería volver al inicio de la secuencia antes de extraer el primer campo. –