7
votes

Pouvez-vous dire à Iostreams que les personnages traitent comme espaces?

Pour que vous puissiez faire quelque chose comme ceci, par exemple: xxx

qui nécessite normalement la chaîne de formatée "01 22 42 18" . Pouvez-vous modifier directement les paramètres locaux actuels?


1 commentaires

Je suppose que tu ne peux pas le faire. Question intéressante si +1


4 Réponses :


2
votes

Jetez un coup d'œil à scanf et FSCANF . Vous pourriez * être capable de faire quelque chose comme ceci: xxx

* cavalier: ça a été un moment pour moi et C ++


4 commentaires

Droite, à l'aide de C scanf au lieu de C ++ 'S IStream :: opérateur >> est vraiment beaucoup plus facile. Vous avez peut-être pu dire sscanf (A.C_STR (), "% D:% D:% d.% D", & h, & m, & s, & f) == 4 cependant.


Merci, c'est une solution pratique.


@ephemient Ya, c'est celui. Comme je l'ai dit, cela fait longtemps que j'ai touché n'importe quel C / C ++ @Henle si c'est votre solution, puis le marquez comme le compagnon de réponse;)


Ok, Justin, puisque tu les demandes bien, mais les autres suggestions étaient bonnes aussi bien! ;)



2
votes
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;

0 commentaires

5
votes

Je ne pense pas que vous puissiez changer le délimiteur par défaut sans créer de nouveaux paramètres locaux, mais cela semble piraté. Ce que vous pouvez utiliser, c'est utiliser getline avec un troisième paramètre spécifiant le délimiteur caractère ou vous pouvez lire les délimiteurs et ne rien faire avec eux (par exemple, SS >> H >> D >> M >> D >> S >> D >> F).

Vous pouvez également écrire votre propre classe d'analyse qui gère des cordes fractionnées pour vous. Ou mieux encore, utilisez Boost :: Split < / a> de Boost's bibliothèque d'algorithmes de chaîne . < / p>


2 commentaires

la chose agaçante avec boost :: Split et GetLine est que vous devez diviser les chaînes, puis les nourrir dans un flux pour obtenir les entiers


Vous pouvez utiliser boost :: Split pour transformer le std :: string dans un std :: vecteur , puis utilisez std :: transformez avec boost :: lexical_cast pour transformer le std :: vecteur dans un STD: : Vector



4
votes

Vous pouvez le faire en créant un paramètre local avec un classificateur de facette CTYpe : comme blancheur.

Jerry Coffin explique Comment vous pouvez spécifier des caractères blancheurs dans cette réponse à une autre question .


2 commentaires

Merci, ce serait la réponse littérale à ma question! Bien que j'essaye de comprendre si vous pouvez simplement faire un RC [':'] = STD :: CTYPE_BASE :: espace; Sans créer de tout nouveau local ...


Malheureusement, puisque iOS_BASE classe des personnages comme WhitSpace basé sur les paramètres régionaux imprécis, je ne pense pas qu'il y ait d'autres options. Suggestion de Firas de Boost de Boost :: Split (ou, Alternativement, Boost :: Tokenizer) est probablement votre prochain meilleur choix.