IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Concaténation string avec system("")


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    Par défaut Concaténation string avec system("")
    Bonjour,

    Je fais une application en C++ et je n'arrive pas à concatener un system("") avec un string... je retourne la situation dans tout les sens mais pas moyen que ça fonctionne...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string chemin = system("pwd");
    string chemin2 = "/test/test1.py";
     
    cheminOK = chemin + chemin2;
     
    system(cheminOK);
    une idée ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    une idée ?
    Oui, faire attention au message d'erreur, qui doit t'indiquer que system() attend un const char* et refuse donc un std::string.

    utiliser string::c_str()
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    Par défaut
    A la compilation j'ai bien l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "invalid conversion from 'int' to 'const char*'
    à la ligne 1 donc je ne sais pas trop comment faire...

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Quelle est le type de cheminOK ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    Par défaut
    un string aussi mais le problème est que l'erreur est en ligne 1 au moment de la récupération dans le string. Du coup, je ne peux pas faire un c_str() au moment la récupération,si ?

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    system retourne un int (cf man de system).

    Tu ne peux pas convertir un int en string il faut passer par une variable intermédiaire :
    http://cpp.developpez.com/faq/cpp/?p...RINGS_numtostr

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    Par défaut
    le problème est que ma commande "pwd" est une commande Linux qui renvoie un chemin actuel et non un int...

    et si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int chemin = system("pwd");
    cout << chemin << endl;
    chemin = 0 alors que j'attends quelque chose du style : /home/quake/dev

    Si je fais avec ostringstream comme vous me le dites, j'ai chemin = 0 aussi

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Si tu veux récupérer le chemin actuel, il faut utiliser getenv

    System est une fonction qui prend en paramètre une chaine de caractère et qui renvois le code de retour (un int) du shell lancé.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    Par défaut
    Avec getenv j'obtiens comme chemin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    autrement dit pas du tout le chemin de mon répertoire courant/actuel.

    Alors qu'avec system("pwd"); quand je le récupère en char j'ai bien le bon chemin même si après j'arrive pas le caster comme il faut.

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    et si au lieu d'utiliser system("pwd") qui est bien crade, tu utilisais un appel système qui te retourne le répertoire courant ?

    getcwd
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par quake3 Voir le message
    Avec getenv j'obtiens comme chemin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    Tu récupère le PATH et non le pwd, regarde le man de getenv.

    Citation Envoyé par quake3 Voir le message
    autrement dit pas du tout le chemin de mon répertoire courant/actuel.

    Alors qu'avec system("pwd"); quand je le récupère en char j'ai bien le bon chemin même si après j'arrive pas le caster comme il faut.
    Avec system tu vois le chemin courant sur l'entrée la sortie standard et non par le retour de la fonction system.EDIT : me suis légèrement trompé^^

    Quelques liens qui t'intéresseront :
    http://man.developpez.com/man3/getenv.3.php
    http://man.developpez.com/man5/environ.5.php

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    Par défaut
    Avec getcwd() ça fonctionne nickel pour récupérer le bon chemin. Merci ram-0000

    Ci-joint le code pour aider d'autre personnes dans le futur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char * pPath= new char[1024];
        pPath = getcwd(pPath,50);
        if (pPath != NULL)
            printf("path is : %s", pPath);
        else
            printf("No pPath");

    Sinon pour concaténer, j'ai toujours un des problèmes pour concaténer de façon à pouvoir exécuter mon test.py :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        pPath = pPath + "/test/test.py";
     
        system(pPath);

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    - inutile d'allouer dynamiquement un tableau à taille fixe
    - sutout pour oublier de le libérer
    - à fortiori pour le remplacer la ligne d'après

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char * pPath = getcwd(pPath,50);
        if (pPath != NULL)
            printf("path is : %s", pPath);
        else
            printf("No pPath");
    devrait suffire.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    Par défaut
    En effet

  15. #15
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Je remarque qu'une personne a mis un vote négatif à environ toutes les personnes ayant essayée d'aider le PO.

    J'ai relu assez vite les posts mais je ne vois pas d'erreurs ni de hors-sujet.

    Dans l'éventualité où nous aurions dit des bêtises (ça peut arriver^^), est-ce que la personne à l'origine de ces votes pourrait nous dire où nous nous serions trompés?
    Ainsi nous pourrions voir, comprendre puis apprendre de nos erreurs afin de ne plus les reproduire à l'avenir.

  16. #16
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Heu ... ça c'est pas bon, ça va péter un jour ou l'autre.

    Citation Envoyé par Bousk Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * pPath = getcwd(pPath,50);
    Ça, c'est mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char pPath[PATH_MAX];
    char *ptr = getcwd(pPath, sizeof(pPath));
    if(ptr ...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  17. #17
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    J'ai lu le man vite fait, n'est-il pas plus simple de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char * ptr = getcwd(NULL, 0);
    Car si on renseigne le pointeur (!= NULL) ou si on renseigne la taille (> 0), il faudra que la taille allouée soit suffisante et dans le cas où ce n'est pas le cas, il faut faire un realloc puis rappeler la fonction getcwd.

    Alors que là, getcwd se charge de tout pour nous.

    /!\ bien penser à faire le free.

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je n'ai pas regardé le manuel au moment de ma réponse et l'ai parcouru qu'en diagonale maintenant.
    Je pense que la solution de Neckara serait la meilleure (en tous cas celle que je trouve la plus simple), en faisant attention au free, mais semble dépendant de la libc utilisée:
    Comme extension de la norme POSIX.1-2001, la version Linux (libc4, libc5, glibc) de getcwd() alloue le tampon dynamiquement, en utilisant malloc(3), si buf est NULL lors de l'appel. Dans ce cas, le tampon alloué a la longueur size à moins que size soit égal à zéro, auquel cas buf est alloué avec la taille nécessaire. Il est possible (et même fortement conseillé) de libérer le tampon avec free(3) lorsqu'il a été obtenu ainsi.
    http://manpagesfr.free.fr/man/man3/getcwd.3.html
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  19. #19
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Par rapport à la demande originel de monsieur, je voulais préciser que la fonction system ne renvoie pas le résultat de la commande... Généralement, mais comme dit précédemment c'est bien crade, les gens qui utilise system de cette manière redirige dans un fichier le résultat de la commande et lise le fichier pour récupérer le résultat.

    De cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system("pwd > mon_chemin.txt");
    Mais comme tu es quelqu'un de propre, et que tu veux un programme pas trop lent, utilise les méthodes décrites si avant

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    Par défaut
    Ok c'est noté, merci beaucoup à vous tous pour vos précieux conseils

    Pour la concaténation char + string qui puisse fonctionner avec ma commande system() (cette fois-ci pour lancer le fichier test.py), j'ai fait ça mais je sais que ça ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    string cheminTest = "/test/test.py";
     
    pPath = pPath + cheminTest; 
    // Bien sure il y a une erreur ici mais je n'arrive pas à m'en dépatouiller en castant dans tout les sens.
     
    system(pPath);
    Un idée simple et précise ? Ça doit être pourtant plutôt simple à faire mais le c++ me rebute un peu (c'est aussi pour cela que je souhaite lancer des scripts en python !!!)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. PHP 4 : Concaténer string avec balise
    Par Shixz dans le forum Langage
    Réponses: 5
    Dernier message: 30/12/2008, 14h55
  2. [MySQL] Problème avec un double quote
    Par wormseric dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 26/01/2007, 14h44
  3. [Tableaux] souci avec des simples quotes
    Par Jean Fi dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2006, 20h13
  4. Réponses: 5
    Dernier message: 30/05/2005, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo