stringstream question

Le
david
Bonjour,
Comment puis je utiliser stringstream dans le code ci dessous pour
récupere des champs séparés par des tabulations ?



..
istringstream instream;
ostringstream outstream;

instream.str(ligne);
string CHAMPS;

while (instream >> CHAMPS)

//comment recupere les champs sépares par des tabulations
//par exemple: CHAMP1 CHAMP2 CHAMP3

}

meric
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Franck Branjonneau
Le #715062
david
Comment puis je utiliser stringstream dans le code ci dessous pour
récupere des champs séparés par des tabulations ?


Que veux-tu exactement : tu définis CHAMPS comme string, et tu parles
de CHAMP1 CHAMP2 CHAMP3 ?

Dans le code suivant :

#include <string>
#include <sstream>

int
main() {

std::string line="atbtc";
std::string CHAMPS;

instream.str(line);
while(instream >> CHAMPS) {

}

return 0;
}

CHAMPS prend tour a tour les valeurs a, b et c.
--
Franck Branjonneau
david
Le #714202
Ok merci,
Mais juste un truc,
supossons que line ="une_va leu rtune autre valeur t"
Le delimiteur entre les champs est une tabulation mais chaque champ peut
contenir des espaces.Comment faire alors ?


Franck Branjonneau wrote:
david

Comment puis je utiliser stringstream dans le code ci dessous pour
récupere des champs séparés par des tabulations ?



Que veux-tu exactement : tu définis CHAMPS comme string, et tu parles
de CHAMP1 CHAMP2 CHAMP3 ?

Dans le code suivant :

#include <string>
#include <sstream>

int
main() {

std::string line="atbtc";
std::string CHAMPS;

instream.str(line);
while(instream >> CHAMPS) {

}

return 0;
}

CHAMPS prend tour a tour les valeurs a, b et c.



Michel Michaud
Le #738066
Dans news:c4r2rm$10gp$, david
Mais juste un truc,
supossons que line ="une_va leu rtune autre valeur t"
Le delimiteur entre les champs est une tabulation mais chaque champ
peut contenir des espaces.Comment faire alors ?


getline permet de spécifier un délimiteur quelconque, dont 'n'
i.e. getline(flux, resultatExtrait, delimiteur)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

kanze
Le #737745
david news:
Mais juste un truc,
supossons que line ="une_va leu rtune autre valeur t"
Le delimiteur entre les champs est une tabulation mais chaque champ peut
contenir des espaces.Comment faire alors ?


La définition d'un « champ » dans les istream est figée : c'est un
« mot », séparé par des « blancs », c-à-d tout caractère pour lequel
std::isspace renvoie vrai.

Si cette définition ne convient pas, il existe plusieurs solutions :

- Si on est certain de n'avoir que des implémentations modernes de la
bibliothèque, on peut abuser des locales, en créant son propre
facette ctype, et en l'installant dans le flux. Personnellement, ce
n'est pas une solution qui me plaît : d'une part, c'est un abus
flagrant des locales, qui pourrait faire des surprises à d'autres
utilisateurs du flux (s'il y en a), de l'autre, je trouve que
l'écriture d'une facette et son installation est loin d'être
trivial -- ça ferait beaucoup de travail pour assez peu de souplesse
en fin de compte.

- Il y a boost::regex (www.boost.org). On définit le format d'une
ligne au moyen d'une expression rationnelle, avec des champs qu'on
extrait. C'est à la fois extrèmement flexible, et peu
flexible. Extrèmement flexible, parce que la définition d'un champs
et des séparateurs peut être prèsque n'importe quoi ; les
séparateurs peuvent même varier entre les différents champs. Peu
flexible, surtout parce que le nombre de champs est plutôt fixe.

- Enfin, il y a GB_FieldArray (www.gabi-soft.fr, pour l'instant, au
moins). Ici, on affecte une chaîne, et la classe le découpe en
champs ; on y accède comme à une collection STL non-modifiable. La
découpe en champs se fait par délégation, ce qui fait qu'on peut
définir à peu près ce qu'on veut. Par rapport à boost::regex, il a
l'avantage que le nombre de champs est libre, et le désavantage que
la découpe en champs doit être programmée directement en C++, et non
au moyen d'un langage spécialisé comme des expressions rationnelle.
(Chez moi, j'ai une version qui permet de spécifier le séparateur au
moyen des expressions rationnelles.) Aussi, il marche avec des
compilateurs assez anciens, ce qui n'est pas le cas des autres
solutions ci-dessus.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Franck Branjonneau
Le #737420
david
Ok merci,
Mais juste un truc,
supossons que line ="une_va leu rtune autre valeur t"
Le delimiteur entre les champs est une tabulation mais chaque champ
peut contenir des espaces.Comment faire alors ?


James et Michel t'ont donné un réponse en terme de flux ; mais comme
ta question portait sur un std::stringstream j'ajouterais que tu peux
aussi envisager d'en extraire la std::string et utiliser les fonctions
de la famille find.
--
Franck Branjonneau
kanze
Le #737142
Franck Branjonneau news:
david
Mais juste un truc,
supossons que line ="une_va leu rtune autre valeur t"
Le delimiteur entre les champs est une tabulation mais chaque champ
peut contenir des espaces.Comment faire alors ?


James et Michel t'ont donné un réponse en terme de flux ; mais comme
ta question portait sur un std::stringstream j'ajouterais que tu peux
aussi envisager d'en extraire la std::string et utiliser les fonctions
de la famille find.


En fait, la plupart de mes suggestions (boost::regex, GB_FieldArray) se
basaient sur des chaînes aussi -- que la source soit un fichier ou une
chaîne, j'utiliserais getline pour une ligne, puis je en ferais la
découpe avec un des outils que j'ai cité.

Et en fait, dans les ces versions les plus récentes,
GB_CharacterSeparatedFields (un GB_FieldArray qui découpe les champs
selon un caractère seul) utilise string::find dans l'implémentation du
délégué.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Publicité
Poster une réponse
Anonyme