Reputation: 493
So that you could do something like this, for instance:
std::string a("01:22:42.18");
std::stringstream ss(a);
int h, m, s, f;
ss >> h >> m >> s >> f;
Which normally requires the string to be formatted "01 22 42 18"
.
Can you modify the current locale directly to do this?
Upvotes: 8
Views: 641
Reputation: 31300
Take a look at scanf and fscanf. You might* be able to do something like this:
int h, m, s, f;
sscanf(a.c_str(), "%d:%d:%d.%d", &h, &m, &s, &f);
* Caveat: It's been a while for me and C++
Upvotes: 2
Reputation: 355197
You can do this by creating a locale with a ctype facet classifying :
as whitespace.
Jerry Coffin explains how you can specify whitespace characters in this answer to another question.
Upvotes: 5
Reputation: 25760
I don't think you can change the default delimiter without creating a new locale, but that seems hackish. What you can use do is use getline with a third parameter specifying the delimiter character or you could read the delimiters and not do anything with them (e.g. ss >> h >> d >> m >> d >> s >> d >> f).
You could also write your own parsing class that handles splitting strings for you. Or better yet, use boost::split from Boost's String Algorithms Library.
Upvotes: 5
Reputation: 204906
char c;
if (!(ss >> h >> c) || c != ':') return;
if (!(ss >> m >> c) || c != ':') return;
if (!(ss >> s >> c) || c != '.') return;
if (!(ss >> f) || ss >> c) return;
Upvotes: 2