7
votes

C ++ String Comment

C'est une question très simple et je me sens stupide de le demander, mais je suis pressé pendant le temps et j'ai besoin de le comprendre :)

J'ai juste besoin de savoir comment faire une chaîne contenant du texte et d'autres variables. Par exemple, en Java, je peux juste faire ceci: p> xxx pré>

EDIT 4: P>

OK, la réponse de Rahul G de Rahul G est assez bonne et le programme compile et Ok, mais quand je l'exécute au lieu d'obtenir la chaîne, je veux pour le nom de fichier, je reçois un tas de chiffres. Par exemple: crée: "013679000.jpg" au lieu de "cadre 0.jpg" comme je veux. Toute pensée? P>

for(int i = 0; frames; i++)
{  
  frame = cvQueryFrame(capture); 
  std::string s = static_cast<std::ostringstream &>(std::ostringstream() << argv[1] <<  i << " .jpg").str(); 
  cvSaveImage(s.c_str(), frame);
} 


11 commentaires

Voulez-vous vraiment faire la chaîne ou simplement l'imprimer? Dans ce dernier cas, vous pouvez utiliser la solution @ reko_t, mais faire std :: COUT << "Ce texte a imprimé" << IX "Times";


CVSaveImage (Oss.Str (), Cadre); ne fonctionne pas?


Non, cela ne fonctionne pas, f ****** opencv! Le wiki dit que le premier argument doit être un nom de fichier de chaîne, mais vs continue à me donner cette erreur: Erreur 23 Erreur C2664: 'CVSaveImage': impossible de convertir le paramètre 1 de 'std :: basic_string <_elem, _traits, _AX>' à 'const char *'


@TyPoknig: Essayez CVSaveImage (Oss.Str (). C_STR (), Cadre); . Voir ma réponse pour expliquer.


J'ai suggéré d'éditer pour votre code d'origine. Vous avez pris la moitié du code de ma réponse et la mélange de la moitié de votre message. str () est membre de std :: ostringstream et c_str () est membre de std :: string . Étant donné que s est un std :: string , il vous suffit d'appeler c_str () dessus. C'est-à-dire cvsaveImage (s.c_str (), cadre);


J'ai déjà fait cela déjà et cela ne fonctionne toujours pas, j'ai essayé de multiples variations de ce que vous avez posté, puis ré-posté la version qui comptait la moindre quantité d'erreurs (lorsque j'ai utilisé tout ce que vous avez fourni, j'ai eu 4 erreurs quand je l'ai mélangé avec ce que j'avais eu 3).


Le code de TtyPoknig Rahul est incorrect.


Personne ne semble avoir suggéré inclure .


@typoknig: Neil a raison. Voir la nouvelle réponse modifiée.


L'opérateur << de std :: ostringstream est hérité de STD :: basic_ostream, par conséquent, il renvoie une référence à STD :: basic_ostream &. Pour utiliser .str () dessus, vous devez la jeter d'abord. Cependant, ce serait tellement plus propre de l'affecter d'abord à une variable distincte et utilisez .str () dessus.


Cette question a des informations connexes sur le casting dont vous avez besoin: Stackoverflow.com/Questtions/2433071/...


8 Réponses :


12
votes

Vous pouvez utiliser Stringstreams pour cela:

for (int i = 0; i < 10; i++) {
    std::ostringstream ss;
    ss << "this text has printed " << i << " times";
    std::cout << ss.str() << std::endl;
}


3 commentaires

@ La réponse de reko_t est probablement meilleure que la mienne que son code utilise des constructions C ++, la mine utilise une fonction d'exécution C. Les deux sont valables pour votre exemple, cependant.


Pour une question débutante, il serait utile de montrer les inclut requis: , et .


Oui Charles, merci de pointer ceux qui comprend ceux-ci, je connais daddly à propos de C ++



0
votes

Vous savez que vous avez un bogue dans votre code ?? Vous incrémentez-moi dans la déclaration () et à la fin de la boucle !! Mais je mets digress.

utiliser printf:

printf ("Ce texte a imprimé% D Times \ n", i)

espère que cela aide!


0 commentaires

7
votes

java: xxx pré>

c ++: p> xxx pré>

Veuillez noter que la classe std :: ostringstream code> classe réside dans code> en-tête. p>

EDIT: stry> p>

Votre code (corrigé): P>

for(int i = 0; frames; i++) { 
  frame = cvQueryFrame(capture);
  std::ostringstream oss;
  oss << "frame " << i << " .jpg";
  cvSaveImage(oss.str().c_str(), frame);
}


12 commentaires

Cela ne fonctionnera pas, car le résultat de votre expression entre crochets contenant le stringream est un ostream, qui n'a pas de membre STR ().


@Neil: Merci d'avoir souligné cela. Ajouté une distribution appropriée pour faire ce travail.


@Rahul je ne vois pas pourquoi vous ressentez la nécessité de créer le StringStream comme temporaire sans nom. Donner un nom est réellement plus clair, plus court et compte tenu des compétences de l'OP de C ++, plus facile pour un débutant à comprendre.


SUCCÈS! Merci beaucoup à tous! Je pense que vous savez que vous savez tous ce qui se passe, OpenCV vient de suce, je suggère d'éviter cela à moins que vous n'ayez aucun autre choix :)


@Neil: Je voulais que cela ressemble plus à la version Java. Quoi qu'il en soit, j'ai de nouveau édité le code pour faciliter la compréhension des débutants. Merci pour les suggestions.


OK, le programme compile et correct, mais quand je l'exécute au lieu d'obtenir la chaîne que je souhaite pour le nom de fichier, je reçois un tas de chiffres. Par exemple: << "cadre" << i << ".jpg" crée: "013679000.jpg" au lieu de "cadre 0.jpg" comme je veux. Des pensées?


@tyPoknig: Essayez le nouveau code. La raison pour laquelle cela n'a pas fonctionné est décrit ici: Stackoverflow.com/Questtions/2433071/...


Cela n'aime pas le nouveau code. Je reçois les 3 erreurs suivantes: Erreur C2065: 'S': Erreur d'identifiant non déclaré C2228: Gauche de '.str' doit avoir une erreur de classe / structure / union C2228: à gauche de '.c_str' doit avoir la classe / structure / union qu'il aime votre autre code cependant.


Ma faute. Il devrait être oss , pas s . Encore une fois édité mon message ...


@Rahul je vous suggère vraiment de compiler votre code avant de poster!


@Neil: fera cela à partir de la prochaine fois :-)


Haha, tu vas beaucoup mieux que moi, plus il est tard! Vous étiez bien cependant, cela l'a été corrigé. Demain quand je suis un peu plus lucide, je vais regarder ces autres fils et voir pourquoi cela fonctionne comme ça. Ecrivez en C ++ est difficile quand une connaissance à peine .NET ou Java :)



0
votes

Si l'erreur que vous obtenez est "Erreur C2664:" CVSaveImage ': impossible de convertir le paramètre 1 de "std :: basic_string <_elem _traits _ax>' to 'const char *" alors vous avez besoin d'une chaîne de style C Pas un C ++ One:

cvSaveImage(oss.str().c_str(), frame);


0 commentaires

0
votes

Comment sur cvsaveImage (oss.str (). C_STR (), cadre); ? Cela fera une ancienne chaîne terminée zéro de type C, qui espérons que OpenCV acceptera.


0 commentaires


0
votes

Ceci est une version de votre dernier code avec votre fonction spécifique CALS supprimée afin que je puisse la compiler. Il compile et fonctionne:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main() {

    for(int i = 0; i < 10; i++) { 
        ostringstream os;
        os << "frame" << i << " .jpg";
        string s = os.str();
        cout << s << "\n"; 
     }
}


0 commentaires

3
votes

Il y a une autre façon de faire cela: utilisez Boost :: lexical_cast (je sais, que celui-ci basé sur STD :: Stringstream, mais il est assez utile): xxx


1 commentaires

Cette approche devrait être encouragée. Boost :: lexical_cast <> est concis, auto-documentant et conforme aux autres opérations de moulage ou de conversion C ++. Je crois que lexical_cast a été proposé pour C ++ tr2, de sorte qu'il peut devenir standard (bien que pas bientôt).