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 << '}';
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 << '}';
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 << '}';
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.
stringstream douCoh;
for(unsigned int i=0;i<dataSize;i++)
if(v[i].test)
douCoh << ( douCoh.tellp()==0 ? '{' : ',' ) << i+1;
douCoh << '}';
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 << '}';
Vous pouvez utiliser std::string::erase
pour supprimer le dernier caractère directement de la chaîne sous-jacente.
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 << '}';
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';
}