Comment forcer STD :: StringStream Operateur >> Pour lire une chaîne entière au lieu d'arrêter au premier blanc?
J'ai une classe de modèle qui stocke une valeur lue à partir d'un fichier texte: P> J'ai essayé de régler / déséfinir des drapeaux de flux, mais cela n'a pas aidé. p> Clarification strong> P> P> Le La classe est un modèle de conteneur avec conversion automatique vers / à partir de type T. Strings ne constitue qu'une seule instance du modèle, elle doit également supporter d'autres types également. C'est pourquoi je veux forcer l'opérateur >> imiter le comportement de STD :: getline. P> p>
6 Réponses :
Il n'y a pas de moyen avec l'opérateur >> que je suis au courant de l'écriture de votre propre facette (opérateur >> Stop au premier caractère pour lequel Isspace (C, GetLoc ()) est vrai). Mais il y a une fonction getline dans
Je suis conscient de cela, mais j'ai besoin de conversion de la chaîne à d'autres valeurs également et je ne veux pas créer de conteneur séparé pour les chaînes.
Comme je l'ai dit, l'alternative à utiliser GetLine écrit une facette. Je sais ce que j'utiliserais. Notez que l'utilisation de traits vous permettrait de faire une case spéciale que le comportement de grotch et non du conteneur entier.
Où voulez-vous qu'il arrête? Si vous souhaitez lire une ligne entière, vous avez probablement besoin Fonction GetLine , si vous avez besoin d'un Cordes entières stockées dans l'objet Streamstring Votre choix est Ostringstream :: str méthode. p>
Je pense que ostringstream :: str () est la meilleure solution ici.
Je suppose que vous instanciez ce modèle avec t = std :: string code>. Dans ce cas, vous pouvez utiliser GetLine:
getline(ss, m_value, '\0');
Voici une solution: (Grâce à l'affiche originale du groupe de discussion C ++) P> P>
Si le message d'origine est en ligne quelque part, veuillez inclure un lien!
comme opérateur >> ne satisfaire pas notre exigence lorsque t = chaîne, nous pouvons écrire une fonction spécifique pour [t = string]. Cela peut ne pas être la solution correcte. Mais, comme un travail autour d'avoir mentionné.
S'il vous plaît corrigez-moi s'il ne satisfera pas votre exigence. P>
J'ai écrit un exemple de code comme ci-dessous: P>
#include <iostream> #include <sstream> #include <string> using namespace std; template <class T> class Data { T m_value; public: void set(const T& val); T& get(); }; template <class T> void Data<T>::set(const T& val) { stringstream ss; ss << val; ss >> m_value; } void Data<string>::set(const string& val) { m_value = val; } template <class T> T& Data<T>::get() { return m_value; } int main() { Data<int> d; d.set(10); cout << d.get() << endl; Data<float> f; f.set(10.33); cout << f.get() << endl; Data<string> s; s.set(string("This is problem")); cout << s.get() << endl; }
J'ai effectivement résolu le problème de cette façon, en utilisant un modèle spécialisé pour les chaînes. Merci d'avoir répondu!
Je ne suis pas clair sur ce que le problème est. Si vous voulez
>> code> fonctionner avec la classe
t code> Vous devez remplacer
>> code> comme
stringstream et opérateur >> (T & Récepteur) code>. Dans cette fonction, vous avez accès au
Stringstream code> (via
ceci code>) et à
récepteur code> et que vous pouvez traire de
* Ceci code> quelle que soit la quantité de données que vous voulez. Pourriez-vous s'il vous plaît expliquer le problème plus clairement?
Désolé, c'est
Stringstream & Operateur >> (Stringstream & SS, T & Receiver) Code>, bien sûr et vous accédez à
SS code> directement.