[c++} problème de cast - comprends pas

bon j’ai un problème stupide que je ne comprends pas :


...

 entete += "\\begin{tabular}{|p{1cm}| p{10cm}| p{2cm}| p{2.2cm}|}";
 entete += "\n";
 entete += "\\hline";
 entete += "\n";
 entete += "\\textbf{Pos}&\\textbf{Description}&\\textbf{Quantité}&\\textbf{Prix U.}\\\\";
 entete += "\n";
 entete += "\\hline";
 entete += "\n";
 for ( o; o < nb_lignes; o++)
        {
         entete += (o+1) + "&" + this->designation[o] + "&" + this->quantite[o] + "&" + this->prix[o] +"\\\\";
         entete += "\n";
         entete += "\\hline";
         entete += "\n";
        }

 entete +="\\end{tabular}";
 entete +="\n";
 entete +="\\end{document}";
 bl << entete;
 bl.close();

sachant que :

  • entete est du type string
  • o est du type integer
  • bl est du type ofstream
    la compilation passe sans problème ,mais je n’ai pas ce que j’attends dans le document lui meme :
\begin{tabular}{|p{1cm}| p{10cm}| p{2cm}| p{2.2cm}|}
\hline
\textbf{Pos}&\textbf{Description}&\textbf{Quantité}&\textbf{Prix U.}\\
\hline
&Clavier USB&1&40\\
\hline
&Souris&1&18\\
\hline
\end{tabular}
\end{document}

vous ne le voyez pas mais il insère un caractère incorrect à la place de caster l’int en string …

j’ai juste pris ta boucle, mais essaye avec la valeur ascii entre simples quotes:


for ( o; o < nb_lignes; o++)
       {
        entete += ( '1'+ o ) + "&" + this->designation[o] + "&" + this->quantite[o] + "&" + this->prix[o] +"\\\\";
        entete += "\n";
        entete += "\\hline";
        entete += "\n";
       }


la valeur ascii ? non en fait je souhaite incrémenter o et non pas concaténer o et 1 :oui:

ah ok, j’avais pas pigé

En tout cas, ton programme le fait comme tel, tu as la valeur ascii 001 à la place

Mais pourquoi tu n’utilise pas stringstream? :slight_smile:

Ca serait bien plus propre, et si tu veux afficher directement le fichier, tu peux le faire directement. Et surtout, tu éviterais ce léger problème.

Au passage, après vérification :

http://www.cppreference.com/cppstring/string_operators.html

string operator+( char c, const string& s2 );

Donc ton résultat est normal (c’est la concanétation d’un char et d’une chaîne de caractères, type string) et il faut bien utiliser stringstream pour afficher un nombre.

Ah, dernier détail : stringstream, et comme toutes les sorties formatées en C++, c’est la misère.

(ps: comme en Java, utiliser l’opérateur +, dans une boucle c’est mal)

ça me casse les pieds de devoir utiliser un autre type pour ce genre de choses [:doute]

ouais :slight_smile: dans ce cas, stringstream juste pour l’entier, mais c’est petit.

(et ça revient au même, hein)

Cadeau de la maison :

bl << "\\begin{tabular}{|p{1cm}| p{10cm}| p{2cm}| p{2.2cm}|}";
bl << endl;
bl << "\\hline";
bl << endl;
bl << "\\textbf{Pos}&\\textbf{Description}&\\textbf{Quantité}&\\textbf{Prix U.}\\\\";
bl << endl;
bl << "\\hline";
bl << endl;
for ( o; o < nb_lignes; o++)
       {
        bl << (o+1) << "&" << this->designation[o] << "&" << this->quantite[o] << "&" << this->prix[o] << "\\\\";
bl << endl;
        bl << "\\hline";
        bl << endl;
       }

bl << "\\end{tabular}";
bl << endl;
bl <<"\\end{document}";
bl.close();

merci c’est sympa, je m’en suis inspiré, j’ai un chti prob mais rien de bien grave, je m’en occuperai demain :jap:

merci en tout cas

et n’oublie pas : stringstream est ton amie !

bon je viens de le faire avec ta méthode, et cela fonctionne effectivement très bien.
merci encore (voila que je crée des bons de livraison en latex à la volée :love:)

Juste pour information, tu ne peux pas passer un int dans une string. Je m’explique :

quand tu fais :
int c = 0;
std::string str;

str = c + " gna gna";

La class string ne vas pas convertir ton int en chaine de caractères mais le transformer en char et considérer sa valeur comme un code ascii (donc si c = 0, il mettre le caractere de code 0 et ainsi de suite).

Donc si tu veux absolument utiliser la class string avec ton int, il faut d’abord convertir ton int en chaine de caractères (la fonction c ‘atoi’ fera l’affaire).

Autrement, Sans-nom a clairement raison, pour ce type d’utilisation, stringstream, qui lui est capable de convertir un int (ainsi que d’autre type) en chaine de caractères directement, est plus recommandé que l’utilisation de la class string.

en fait je pensais faire un truc du genre :

entete += (string)((int)o+1) + (string)( … )

pour bien forcer les casts, ça aurait pu marcher. mais pour une raison x ou y ce genre de combine de castation (:ane:) ne fonctionne pas.

BREF - j’utilise l’autre méthode et puis voila, mais merci tout de meme du conseil/??/explication (rayez la mention inutile)

si tu fais ça (le cast façon C/Java) dans un projet C++ c’est que t’as rien pigé au cast :slight_smile:

static_cast,
reinterpret_cast,
const_cast,
dynamic_cast

Sont tes amies !:slight_smile:

en fait normalement j’essaye d’éviter au maximum les casts bricolés dans le style de ce que j’ai écrit plus haut. et effectivement, je n’ai pas la prétention de connaitre les casts sur le bout des doigts :wink:

Say mal! :wink:

(bref, j’en ai bouffé en un semestre du C++)