Можете ли вы сказать iostreams, какие символы следует рассматривать как пробелы? - PullRequest
6 голосов
/ 31 октября 2009

Чтобы вы могли сделать что-то подобное, например:

std::string a("01:22:42.18");
std::stringstream ss(a);
int h, m, s, f;
ss >> h >> m >> s >> f;

Что обычно требует, чтобы строка была отформатирована "01 22 42 18". Можете ли вы изменить текущую локаль напрямую, чтобы сделать это?

Ответы [ 4 ]

5 голосов
/ 31 октября 2009

Не думаю, что вы можете изменить разделитель по умолчанию, не создавая новую локаль, но это кажется хакерским. Вы можете использовать do getline с третьим параметром, определяющим символ разделителя, или вы можете читать разделители и ничего с ними не делать (например, ss >> h >> d >> m >> d> > s >> d >> f).

Вы также можете написать свой собственный класс синтаксического анализа, который обрабатывает расщепление строк для вас. Или еще лучше, используйте boost :: split из библиотеки String Algorithms Boost .

3 голосов
/ 31 октября 2009

Вы можете сделать это, создав локаль с фасетом ctype, который классифицирует : как пробел.

Джерри Коффин объясняет, как вы можете указать пробельные символы в этом ответе на другой вопрос .

2 голосов
/ 31 октября 2009
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;
2 голосов
/ 31 октября 2009

Взгляните на scanf и fscanf . Вы могли бы * быть в состоянии сделать что-то вроде этого:

int h, m, s, f;
sscanf(a.c_str(), "%d:%d:%d.%d", &h, &m, &s, &f);  

* Предостережение: это было время для меня и C ++

...