Question

J'essaie de formater la sortie à l'aide de la bibliothèque NTL (une bibliothèque de théorie des nombres).L'un des objets est l'objet GF2X, qui est un polynôme représenté sous la forme d'une chaîne de coefficients.Un exemple rapide :

GF2X a = GF2X(5,1);
a++;
cout<<a;

donnera [1 0 0 0 0 1] ce qui équivaut à x ^ 5 + 1.Ma question concerne le formatage de cette sortie à l'aide de setw.Je souhaite pouvoir générer des objets GF2X de différentes longueurs, précédés d'un nombre et complétés par une chaîne.J'aimerais que ma sortie ressemble à ceci :

  1:    [x x x x x x x x]       string here
 15:    [x x x]                 string here

Je me contenterais également que le droit ] soit aligné, ce à quoi je devrais probablement m'attendre si j'utilise setw.Cependant, lorsque j'utilise le code (noms de variables omis pour plus de simplicité) :

    cout << setw(3)<< int <<": "<< setw(35) << GF2X << setw(15) << string << endl;

J'obtiens un résultat plutôt comme celui-ci (certains espaces blancs ont été supprimés pour des raisons de compacité)

  1:            [x x x x x x x x]   string here
 15:            [x x x]   string here

En d’autres termes, la fonction setw semble traiter la totalité de la sortie de <<GF2X comme un seul caractère, et ne semble pas réellement tenir compte de la taille de la chaîne de sortie.Comme vous pouvez le voir sur la sortie que je vous ai montrée, le côté gauche de la sortie GF2X est aligné, mais le côté droit ne l'est pas, alors qu'en général, setw semble aligner le côté droit des sorties.

Était-ce utile?

La solution

Vous pouvez le faire en modifiant l'opérateur de sortie.J'imagine que c'est écrit quelque chose comme ceci (je ne connais rien à cette classe GF2X, donc c'est partiellement du pseudo-code :

std::ostream & operator<<(std::ostream & os, const GF2X & x)
{
    os << '[';
    for (int i=0; i<x.num_elements; ++i)
        os << x.get_element(i) << ' ';
    return os << ']';
}

Le problème est que setw n'opérera que sur ce premier '[', il n'opérera pas sur l'objet entier (il ne sait pas ce qu'est l'objet entier).Vous pouvez corriger l'opérateur en écrivant le tout dans une chaîne (en utilisant stringstream ou un autre moyen), et alors sortir la chaîne.Si la modification de l'opérateur n'est pas une option pour vous, vous devrez alors utiliser une fonction d'assistance distincte pour d'abord convertir l'objet en chaîne (à l'aide d'un flux de chaînes), puis afficher cette chaîne dans le flux.

En fait, boost::lexical_cast serait très utile pour vous ici, car cela durera pour vous :

cout << setw(35) << boost::lexical_cast<std::string>(GF2X);

Autres conseils

Vous pouvez utiliser un objet ostringstream temporaire pour conserver la sortie, puis utiliser setw sur la chaîne fournie (noms de variables omis).

    ostringstream oss;
    oss << GF2X;
    cout << setw(3) << x << ": "<< setw(35) << oss.str() << setw(15) << string <<endl;

Cela formate l'intégralité de l'objet ostream, plutôt que seulement le premier caractère, et donne le résultat approprié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top