OVH Cloud OVH Cloud

stringstream

5 réponses
Avatar
Benoit Rousseau
Bonjour,
Je voudrais un istream qui simule l'arrivée de messages qui sont déjà
entreposés dans une queue. Ces messages doivent arrivée à interval
régulier. J'ai testé le code suivant, mais je voudrais votre avis sur
l'utilisation du stringstream puisque je n'ai rien trouvé d'approprié
sur le net...:

queue<string> msg; //La queue de messages
stringstream iss; //Le stringstream

void init() { //Initialise la queue
msg.push("a");
msg.push("f");
msg.push("c");
msg.push("aei ouy");
msg.push("B");
msg.push("fin");
}

void tic() { //Fonction appellée à chaque interval
string mot = msg.front();
iss.clear(); //C'est ici que j'ai des doutes
iss << mot; //Et ici aussi, mais moins
msg.pop();
}

int main() {
string mot;
init();
while( 1 ) {
tic(); //Mettre à jour le flux
while( ! iss.eof() ) { //Tant que le flux n'est pas vide ?
iss >> mot; //Lire un mot dans le flux
if( mot == "fin" ) return 0;
cout<< mot << " " ;
}
cout << endl;
}
}


Par la même occasion, je voudrais un ostream qui absorbe tout ce qui lui
arrive sans les traiter (un peu comme le /dev/null sous unix)

--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/

5 réponses

Avatar
Samuel Krempp
le Sunday 26 October 2003 16:40, écrivit :
stringstream iss; //Le stringstream
iss.clear(); //C'est ici que j'ai des doutes


si vraiment tu veux faire ça, tu peux lire le fil de discussion (le sujet
contient stringstream, donc tu aurais pu le trouver avant de poster)
contenant le message
<3f6b9ee0$0$10416$

sinon, le plus simple (mais plus lent) est d'utiliser le stringstream 1 fois
poury mettre qq chose, 1 fois pour en sortir qq chose, puis en prendre un
autre la fois suivante.

le mélange de variables globales et de fonctions dans ton bout de code n'est
pas recommandé, et j'aurais dû mal à montrer ce que je veux dire en ne
modifiant que qques lignes.

mais si tu as vraiment l'ensemble des chaines de caractères sagement rangées
dans un container, le mieux est évidemment de ne pas passer par un
stringstream, mais de prendre directement les chaines..

Ce n'est probablement que du code artificiel que tu as écrit pour aborder qq
chose, quelle est la situation réelle, en 2 mots ?

--
Sam

Avatar
Benoit Rousseau
Samuel Krempp wrote:
le Sunday 26 October 2003 16:40, écrivit :

stringstream iss; //Le stringstream
iss.clear(); //C'est ici que j'ai des doutes



si vraiment tu veux faire ça, tu peux lire le fil de discussion (le sujet
contient stringstream, donc tu aurais pu le trouver avant de poster)
contenant le message
<3f6b9ee0$0$10416$
Comment fait on pour retrouver un message indexé de cette façon ?


le mélange de variables globales et de fonctions dans ton bout de code n'est
pas recommandé, et j'aurais dû mal à montrer ce que je veux dire en ne
modifiant que qques lignes.
Ce n'est probablement que du code artificiel que tu as écrit pour aborder qq
chose, quelle est la situation réelle, en 2 mots ?


C'est un code articifiel pour faire des tests. Les chaines sont
récupérées depuis un fichier de log, mais je veux que le fichier de log
ait me même comportement que le programme qui l'a généré et qu'il ne
fournisse les messages qu'à intervale régulier


--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/


Avatar
Samuel Krempp
le Friday 07 November 2003 10:17, écrivit :

Samuel Krempp wrote:
le Sunday 26 October 2003 16:40, écrivit :

stringstream iss; //Le stringstream
iss.clear(); //C'est ici que j'ai des doutes



si vraiment tu veux faire ça, tu peux lire le fil de discussion (le sujet
contient stringstream, donc tu aurais pu le trouver avant de poster)
contenant le message

Comment fait on pour retrouver un message indexé de cette façon ?



ben normalement on clique dessus.. certains logiciels comprennent mieux
<news:3f6b9ee0$0$10416$.
ou alors le logiciel fournit cette possibilité dans son outil de recherche.
(par champ message-id)

en fait le sujet est "ostreams et effacement", je me suis trompé ça contient
ostream, pas stringstream, au temps pour moi.
et ça date du 19 septembre.

C'est un code articifiel pour faire des tests. Les chaines sont
récupérées depuis un fichier de log, mais je veux que le fichier de log
ait me même comportement que le programme qui l'a généré et qu'il ne
fournisse les messages qu'à intervale régulier


mais qu'est ce qui est testé ? je ne sais pas pquoi il est nécessaire de
passer par un conteneur en mémoire, puis un stringstream, au lieu de
simplement lire un fichier par morceau pour émuler la réception de
messages, (fstream flog; while(...) { flog >> mot; ... } ), mais je pense
que c'est probablement une mauvaise idée.
si le but est de mesurer des performances, le stringstream va bcp fausser
les choses, plus que "l'effet disque dur" (amoindri par le cache système,
et le buffer du fstream) de la lecture directement dans le fstream

--
Sam



Avatar
Benoit Rousseau
Samuel Krempp wrote:

en fait le sujet est "ostreams et effacement", je me suis trompé ça contient
ostream, pas stringstream, au temps pour moi.
et ça date du 19 septembre.


C'est un code articifiel pour faire des tests. Les chaines sont
récupérées depuis un fichier de log, mais je veux que le fichier de log
ait me même comportement que le programme qui l'a généré et qu'il ne
fournisse les messages qu'à intervale régulier



mais qu'est ce qui est testé ? je ne sais pas pquoi il est nécessaire de
passer par un conteneur en mémoire, puis un stringstream, au lieu de
simplement lire un fichier par morceau pour émuler la réception de
messages, (fstream flog; while(...) { flog >> mot; ... } ), mais je pense
que c'est probablement une mauvaise idée.
si le but est de mesurer des performances, le stringstream va bcp fausser
les choses, plus que "l'effet disque dur" (amoindri par le cache système,
et le buffer du fstream) de la lecture directement dans le fstream


Il s'agit de rejouer une simulation.

C'est pour que le simulateur n'ait pas à se préoccuper des données.
Une classe RobotIO retourne un istream et un ostream avec lesquels le
simulateur interagit.

Lors de la simulation, un programme m'envoie des informations à des
intervales de temps réguliers. Et dans ce cas, j'utilise un fstream
normal (via un pipe). Ces informations sont stockées dans un fichier
avec des info supplémentaires sur le temps (une chaine "tic" est ajoutée
à la fin de chaque interval pour signaler que c'est la fin de la
transition pour ce laps de temps).

Quand je rejoue, le simulateur doit penser qu'il s'agit toujours du même
programme. Je lis donc le fichier jusqu'à "tic" à chaque fois que le
programme m'envoie un signale. Le simulateur peut alors lire les
informations dans un stringstream comme si elle venait du fstream à
chaque interval de temps.





--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/


Avatar
Fabien LE LEZ
On Fri, 07 Nov 2003 13:11:06 +0100, Samuel Krempp
wrote:

Comment fait on pour retrouver un message indexé de cette façon ?


ben normalement on clique dessus.. certains logiciels comprennent mieux
<news:3f6b9ee0$0$10416$.


Au pire, on copie le message-id dans les archives de Google.

--
;-)