changer le séparateur pour le cin (c++)
J'ai redirigé "cin" pour lire à partir d'un fichier de flux cin.rdbug(inF.rdbug())
Lorsque j'utilise l'extraction de l'opérateur, il lit jusqu'à ce qu'il atteigne un caractère espace blanc.
Est-il possible d'utiliser un autre délimiteur? Je suis allé par le biais de l'api dans cplusplus.com, mais ne trouve rien.
- Vous n'utilisez pas
operator<<
avecstd::cin
, vouliez-vous dire>>
? - vous pourriez essayer de include white-space caractères dans cin tampon.
- Cela ne fonctionne pas. Cela signifie seulement que, compte tenu de l'entrée "B", d'extraire le premier mot qui vous obtient Un "a" au lieu de "Un".
Vous devez vous connecter pour publier un commentaire.
Il est possible de changer l'inter-mot délimiteur pour
cin
ou de tout autrestd::istream
, à l'aide destd::ios_base::imprégnez
d'ajouter desctype
facette
.Si vous êtes à la lecture d'un fichier dans le style de /etc/passwd, le programme suivant va lire chaque
:
délimité par mot séparément.new
de façon incontrôlée est mal, inutile de dire que vous n'avez pasdelete
votre struct (et il n'y a pas moyen de supprimer un sans nom pointeur). TOUJOURS essayershared_ptr
à la place, si possible.std::facet
est une refernce compte de pointeur,std::locale::locale
nécessite un pointeur brut, pas un pointeur partagé, etstd::locale::~locale
est défini àdelete
la facette pointeur. Si vous avez un problème avec l'interface delocale
, prendre avec la commission des normes, pas moi. Voir l'exemple de programme dans le en.cppreference.com/w/cpp/locale/locale/localeget_locale
pour envelopper ces utilisation inhabituelle denew
avec des commentaires. Donc le code examinateur va réaliser qu'il ya quelque chose de mal avec l'interface, pas le code de l'écrivain. Et c'est ce que je veux dire pour "contrôlée" façon d'utilisernew
.unique_ptr<colon_is_space>(new colon is_space).release()
. Bien que, fondamentalement, c'est la même chose de votre code, mais plus détaillé, il indique que vous transférez le pointeur de la propriété.Pour les chaînes, vous pouvez utiliser le
std::getline
surcharges à lire grâce à une autre délimiteur.Pour le numéro d'extraction, le délimiteur n'est pas vraiment "espaces" pour commencer, mais n'importe quel caractère non valide dans un certain nombre.
foo
est unint
,istringstream("123 456") >> foo;
met123
dansfoo
, pas123456
.istringstream("123_456") >> foo;
ou Essayeristringstream("123|456") >> foo;
ctype_base::space
le flux est à la recherche d'un caractère qui n'est pas défini commectype_base::digit
.std::getline
est optimisé pour les performances?getline
est pas plus lent que le flux de données est un ensemble, mais si la performance est une préoccupation pour vous, vous devriez regarder pour les non-stream options."C'est une amélioration sur Robᵩ's réponse, parce que c'est la bonne (et je suis déçu qu'il n'a pas été acceptée.)
Ce que vous devez faire est de modifier le tableau qui
ctype
regarde de décider ce qu'est un délimiteur est.Dans le cas le plus simple, vous pouvez créer votre propre:
Sur ma machine
'\n'
est de 10. J'ai mis que l'élément du tableau à la valeur de délimiteur:ctype_base::space
. Unctype
initialisé avecfoo
serait seulement de délimiter sur'\n'
pas' '
ou'\t'
.Maintenant, c'est un problème parce que le tableau passé en
ctype
définit plus que ce que un délimiteur est, il définit également leters, des chiffres, des symboles, et quelques autres cochonneries nécessaire pour le streaming. (Ben Voigt's réponse sur cette touche.) Donc, ce que nous voulons vraiment, c'est modifier unmask
, pas d'en créer un à partir de zéro.Qui peut être fait comme ceci:
Un
ctype
initialisé avecbar
permettrait de délimiter sur'\n'
et':'
mais pas' '
ou'\t'
.- Vous mis en place
cin
, ou de toute autreistream
, pour l'utilisation de votre personnaliséctype
comme ceci:Vous pouvez également basculer entre les
ctype
s et le comportement de changement à mi-parcours:Si vous avez besoin de revenir au comportement par défaut, il suffit de faire ceci:
Live exemple
bar['\t']
à zéro, sans doute pas prévu. Pour effacer un peu, utiliser&~
(bit à bit ET bit-wise PAS).!
est PAS logique et ne pas avoir l'effet désiré.space
etcntrl
bits et j'ai accidentellement ai tout.C'est une amélioration sur Jon réponse, et l'exemple de cppreference.com. Si cela suit le même principe que tous les deux, mais les combine avec paramétrée délimiteurs.
Cheers!