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 :

convertir un ansistring en const char*


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut convertir un ansistring en const char*
    Bonjour,

    dans mon soft, j'utilise une base de données mysql, aussi j'ai créé un système de dump et de restauration.

    pour la restauration je passe par la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system(const char * valeur);
    Le hic, c'est que je récupère le chemin d'accès de mon fichier sql dans une variable de type String ou AnsiString.

    donc ce n'est pas compatible avec ce qu'a besoin la commande "system" où il faut du Const char *.

    Ma question est la suivante, comment dois je convertir mon String en Const char * ?

    merci d'avance

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut
    Merci !

    J'ai complètement zappé de regarder dans la FAQ..... et surtout de faire sur BCB ^^

    En tout cas voici le code pour ceux qui auraient été ou seront dans cet embarras:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    chemin = "C:\\mysql\\bin\\mysql maBase< ";
    chemin += valRoot;  //chemin d'accès du fichier sql vennant du dump
    char * cmd = new char[chemin.Length()+1];
    strcpy(cmd,chemin.c_str());
    system(cmd);

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    N'aurait-il pas été plus simple de faire juste:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    chemin = "C:\\mysql\\bin\\mysql maBase< ";
    chemin += valRoot;  //chemin d'accès du fichier sql vennant du dump
    system(chemin.c_str());
    ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut
    effectivement, j'ai préféré faire un code plus orienté "usine à gaz" afin, lors de mon passage en mode pas à pas, que je puisse vérifier que la conversion se passe bien, et qu'aucun caractère n'ai été altéré.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    char * cmd = new char[chemin.Length()+1];
    strcpy(cmd,chemin.c_str());
    Tu peux faire un memcpy ici (voire même un memcpy aligné), ça ira plus vite.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    N'aurait-il pas été plus simple de faire juste:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    chemin = "C:\\mysql\\bin\\mysql maBase< ";
    chemin += valRoot;  //chemin d'accès du fichier sql vennant du dump
    system(chemin.c_str());
    ?
    Si on n'en croit la FAQ, non, car le pointeur est temporaire:
    Citation Envoyé par F.A.Q.
    Attention ! La méthode c_str retourne un pointeur sur une chaîne C, qui n'est valable que pour l'instruction suivant l'appel à c_str. En d'autres termes, vous ne pouvez pas faire ceci :

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Les temporaires vivent au moins jusqu'au retour d'une fonction à laquelle ils sont transmis en argument, non?

    En supposant que la fonction system() ne modifie pas elle-même la string, bien entendu.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Si on n'en croit la FAQ, non, car le pointeur est temporaire:
    En fait non, la FAQ dit que ce code risque de planter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    AnsiString Src = "Source.txt";
    AnsiString Dest = "Destination.txt";
    char * pSrc = Src.c_str();
    char * pDest = Dest.c_str();
    // instructions
    CopyFile(pSrc,pDest,true);
    A cause de //instructions. La solution avec le strcpy est proposée dans le cas où il y a des instructions entre l'appel à .c_str() et à la fonction concernée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. conversion AnsiString en const char*
    Par Mangacker dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/05/2007, 18h43
  2. Réponses: 3
    Dernier message: 25/10/2006, 22h54
  3. Convertir un "char" en "CONST char"
    Par N3odyme dans le forum C
    Réponses: 3
    Dernier message: 17/08/2006, 19h48
  4. Réponses: 6
    Dernier message: 28/10/2005, 12h11
  5. Réponses: 13
    Dernier message: 06/03/2005, 15h21

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