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> 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);
}
8 Réponses :
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;
}
@ 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:
Oui Charles, merci de pointer ceux qui comprend ceux-ci, je connais daddly à propos de C ++
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. P>
utiliser printf: p>
printf ("Ce texte a imprimé% D Times \ n", i) p>
espère que cela aide! p>
java: c ++: p> Veuillez noter que la classe Votre code (corrigé): P> std :: ostringstream code> classe réside dans for(int i = 0; frames; i++) {
frame = cvQueryFrame(capture);
std::ostringstream oss;
oss << "frame " << i << " .jpg";
cvSaveImage(oss.str().c_str(), frame);
}
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 code>, pas s code>. Encore une fois B> é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 :)
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);
Comment sur cvsaveImage (oss.str (). C_STR (), cadre); code>? Cela fera une ancienne chaîne terminée zéro de type C, qui espérons que OpenCV acceptera. P>
J'ai posté du code pour créer des chaînes en place ici < / a> (essentiellement un wrapper pour masquer le puisque vous avez besoin d'un std :: ostringstream code> et créer un nettoyant de code appelant). L'utilisation serait la suivante: const char * code> Vous devez utiliser: p>
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";
}
}
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):
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).
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"; Code>CVSaveImage (Oss.Str (), Cadre); code> 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); code>. 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 () code> est membre destd :: ostringstream code> etc_str () code> est membre destd :: string code> . Étant donné ques code> est unstd :: string code>, il vous suffit d'appelerc_str () code> dessus. C'est-à-direcvsaveImage (s.c_str (), cadre); code>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 code>. @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/...