web-dev-qa-db-fra.com

enlever le caractère de stringstream et ajouter des données

Dans mon code, il y a une boucle qui ajoute sth comme ce "numéro" à stringstream. Quand cela se termine, j'ai besoin d'extraire ',' add '}' et d'ajouter '{' si la boucle doit être répétée.

Je pensais pouvoir utiliser ignore () pour supprimer ',' mais cela n'a pas fonctionné. Savez-vous comment je peux faire ce que je décris?

exemple:

douCoh << '{';
for(unsigned int i=0;i<dataSize;i++)
  if(v[i].test) douCoh << i+1 << ',';
douCoh.get(); douCoh << '}';
15
lord.didger

Vous pouvez extraire la chaîne (avec le str() membre), supprimer le dernier caractère avec std::string::erase puis redéfinir la nouvelle chaîne en tant que tampon sur std::ostringstream .

Cependant, une meilleure solution serait de ne pas insérer le ',' superflu en premier lieu, en procédant de la sorte:

std::ostringstream douCoh;
const char* separator = "";

douCoh << '{';
for (size_t i = 0; i < dataSize; ++ i)
{
  if (v[i].test)
  {
    douCoh << separator << i + 1;
    separator = ",";
  }
}
douCoh << '}';
27
Sylvain Defresne

Vous pouvez rechercher la variable stringstream et revenir en arrière d'un caractère à l'aide de stringstream::seekp. Notez que cela ne supprime pas le dernier caractère, mais ne déplace que la tête d'écriture. Cela suffit dans ce cas, car nous écrasons le dernier caractère avec un }.

douCoh << '{';
for(unsigned int i=0;i<dataSize;i++)
  if(v[i].test) douCoh << i+1 << ',';
douCoh.seekp(-1,douCoh.cur); douCoh << '}';
25
bcmpinc

J'ai eu ce problème et j'ai découvert que vous pouvez simplement faire:

douCoh.seekp(-1, std::ios_base::end);

Et continuer à insérer des données. Comme d'autres l'ont indiqué, éviter la saisie des données incorrectes est probablement la solution idéale, mais dans mon cas, cela résultait d'une fonction de bibliothèque tierce et je voulais également éviter de copier les données dans des chaînes.

9
jdehesa
stringstream douCoh;
for(unsigned int i=0;i<dataSize;i++)
  if(v[i].test)
    douCoh << ( douCoh.tellp()==0 ? '{' : ',' ) << i+1;
douCoh << '}';
2
Drum Inc

J'ai trouvé cette méthode en utilisant la méthode de pop_back() string depuis c ++ 11. Probablement pas aussi bien que les plus intelligents ci-dessus, mais utile dans des cas beaucoup plus compliqués et/ou pour les paresseux.

douCoh << '{';
for(unsigned int i=0;i<dataSize;i++)
  if(v[i].test) douCoh << i+1 << ',';

string foo(douCoh.str());
foo.pop_back();
douCoh.str(foo);
douCoh.seekp (0, douCoh.end);  

douCoh << '}';
1
DarioP

Vous pouvez utiliser std::string::erase pour supprimer le dernier caractère directement de la chaîne sous-jacente.

0
Björn Pollex

Pourquoi ne pas simplement vérifier le comptoir? Et pas insérer le ','

douCoh << '{';
for(unsigned int i=0;i<dataSize;i++){
  if(v[i].test){
    douCoh << i+1;
    if(i != dataSize - 1) douCoh << ',';
  }
}
/*douCoh.get();*/ douCoh << '}';
0
RedX

Amusez-vous avec std :: copy, les itérateurs et les traits. Vous devez soit supposer que vos données sont inversées, mais que votre sortie peut être rembobinée. plus facile à rembobiner.

#include <ostream>
#include <algorithm>
#include <iterator>

namespace My
{
  template<typename Iterator>
  void print(std::ostream &out, Iterator begin, Iterator end)
  {
    out << '{';
    if (begin != end) {
      Iterator last = end - 1;
      if (begin != last) {
        std::copy(begin, last, std::ostream_iterator< typename std::iterator_traits<Iterator>::value_type  >(out, ", "));
      }
      out << *last;
    }
    out << '}';
  }
}

#include <iostream>

int main(int argc, char** argv)
{
  My::print(std::cout, &argv[0], &argv[argc]);
  std::cout << '\n';
}
0
Benoît