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++Builder Discussion :

system() et "\\"


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 35
    Par défaut system() et "\\"
    Salut salut,

    J'essaie d'executer une commande du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void__fastcall ExecConv(String Root) 
      { 
       AnsiString chemin = "d:\\JIMMY\\dcm2jpg -f j d:\\essai " + Root; 
       system(chemin.c_str()); 
      }
    avec Root valant le string renvoyé par la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SelectDirectory("OK","\\",Root);
    Le problème est que cette fonction renvoie un string genre "D:\toto" alors que la fonction système veut du "D:\\toto"

    J'essai de delete les \ en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for(int i=1;i<=Root.Lenght();i++)
         {
          if (Root[i] == "\\")
               {
                Root.Delete(i,1);
                Root.Insert("\\\\",i);
                }
         }
    Mais rien à faire, mon prog se bloque!
    Je ne vois pas d'où çà vient alors si quelqu'un à déjà tenté...


    Cordialement

  2. #2
    Membre chevronné Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 402
    Par défaut
    Pourquoi cette différence alors que ni les fichiers ni le programme n'a changé ? Windows fait des optimisations à l'insu de mon plein gré ?
    c'est l'inverse alors. Tu enlèves un \ alors qu'il faudrait en rajouter un non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (Root[i] == "\\")
    tu y rentreras jamais dans ce if ...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 35
    Par défaut
    Si si.
    çà m'a étonné aussi mais tu ne peux pas écrire "/" de toute façon!

    "\\" signifie "\" et "\\\\" signifie "\\"

    j'ai essayer çà et çà a marcher mais j'étais décaller de 1 vers la gauche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for(int i=1;i<=Root.Lenght();i++) 
         { 
          if (Root[i] == "\\") 
               { 
                Root.Delete(i,1); 
                Root.Insert("\\\\",i-1); 
                } 
         }
    çà donne çà : "D\\:tot\\otata".
    avec i à la place de i-1 çà devrait donner "D:\\toto\\tata" mais non...çà bloque le prog

    C'est le insert qui ne fonctionne pas bien mais je ne vois pas...

  4. #4
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut Re: system() et "\\"
    Citation Envoyé par La March
    Le problème est que cette fonction renvoie un string genre "D:\toto" alors que la fonction système veut du "D:\\toto"
    NON !
    Que ce soit bien clair. Le doublement du slash est du au fait que c'est le caractère d'échapement en C++, et que donc pour en avoir un vraiment dans la chaîne, il faut le doubler. Il est impossible qu'une fonction retourne des simples slash. En effet, la chaine "D:\toto" voudrait alors dire :
    "D:<tabulation>oto", ce qui est impensable !

    Il s'agit uniquement d'une norme de codage des caractères.

    Fait l'essai en récupérant le texte d'un TEdit avec des simples slashes, et tu verras qu'en mémoire, il ya bien des double slashes.

    Ton problème ne vient pas de là !

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    NON !
    Que ce soit bien clair. Le doublement du slash est du au fait que c'est le caractère d'échapement en C++, et que donc pour en avoir un vraiment dans la chaîne, il faut le doubler. Il est impossible qu'une fonction retourne des simples slash. En effet, la chaine "D:\toto" voudrait alors dire :
    "D:<tabulation>oto", ce qui est impensable !

    Il s'agit uniquement d'une norme de codage des caractères.

    Fait l'essai en récupérant le texte d'un TEdit avec des simples slashes, et tu verras qu'en mémoire, il ya bien des double slashes.

    Ton problème ne vient pas de là !
    Je suis d'accord avec le raisonnement, mais la chute me paraît erronnée. Lorsqu'on tape \\, le compilo l'interprete comme un \ donc la chaine finale en mémoire contient toujours des simples anti-slashs.

    Il suffit de retenir que la séquence '\\' dans un code C++ équivaut au caractère '\' en mémoire.

    Mais personnellement je ne m'embarasse jamais avec les anti-slashs, sachant que les slashs '/' fonctionnent tout aussi bien sous Windows...

  6. #6
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Citation Envoyé par Loulou24
    Je suis d'accord avec le raisonnement, mais la chute me paraît erronnée. Lorsqu'on tape \\, le compilo l'interprete comme un \ donc la chaine finale en mémoire contient toujours des simples anti-slashs.

    Il suffit de retenir que la séquence '\\' dans un code C++ équivaut au caractère '\' en mémoire.
    Tu as tout à fait raison, mea culpa. Je voulais dire qu'un espion présentant la chaîne de caractère "à la C++" montrerait un double slash, ce que j'ai traduit de manière erronée par "en mémoire".
    Citation Envoyé par Loulou24
    Mais personnellement je ne m'embarasse jamais avec les anti-slashs, sachant que les slashs '/' fonctionnent tout aussi bien sous Windows...
    Tout à fait (ruse )

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 35
    Par défaut

    je crois que j'ai à peu près compris se que vous vouliez dire par là.
    Mais j'arrive pas à croire que \=/ . :o

    Sinon merci quand même j'ai trouvé grâce à vos explications.

    Si j'affiche mon chemin renvoyé par SelectDirectory() , çà me donne:
    "D:\toto\tata"
    alors qu'en fait c'est "D:\\toto\\tata" en 'mémoire' ...
    Donc mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void__fastcall ExecConv(String Root) 
      { 
       AnsiString chemin = "d:\\JIMMY\\dcm2jpg -f j d:\\essai " + Root; 
       system(chemin.c_str()); 
      }
    fonctionne.
    j'avais pas essayé, çà me paraissait mort.


    Merci et @++

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

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