Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1128 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [résolu] separateur de chemin : existe t'il une constante?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[résolu] separateur de chemin : existe t'il une constante?

n°1606030
atshaw
Posté le 29-08-2007 à 22:13:04  profilanswer
 

Bonjour,
 
Quelqu'un sait t'il s'il existe un header définissant une constante pour le séparateur de chemin en C. Et quelle est cette constante.
 
En gros, y a t'il un header existant sous la plupart des systeme d'exploitation qui dirait :
PATH_SEPARATOR = "/" sous linux
ou
PATH_SEPARATOR = "\\" sous Windows
...
 
Merci pour toute info.


Message édité par atshaw le 16-09-2007 à 20:29:28
mood
Publicité
Posté le 29-08-2007 à 22:13:04  profilanswer
 

n°1606040
tpierron
Posté le 29-08-2007 à 23:02:18  profilanswer
 

Pas à ma connaissance, mais le slash fonctionne aussi sous Windows (mais pas avec les commandes DOS).

n°1606103
Taz
bisounours-codeur
Posté le 30-08-2007 à 09:48:05  profilanswer
 

pas en standard. Par contre y a plein de bibli (genre glib2) qui proposent des abstractions ou des fonctions comme g_build_filename ou g_build_path

n°1606301
atshaw
Posté le 30-08-2007 à 14:36:29  profilanswer
 

Merci pour vos reponses.
 
1ere solution :  
ne fonctionne pas car mon objectif est d'analyser argv[0] pour ne récupérer que le nom du binaire et mon pas tout le chemin d'accès : j'analyse la chaine de caractère à reculon et je récupère un pointeur sur le 1er "\" sous Windows ou "/" sous linux.
 
2eme solution :
m'embête un peu car l'objectif de l'appli est de tourner sur un OS minimal donc théoriquement sans glib ou autres.
 
Actuellement j'utilise un :
tant que != '\\' et != '/'  
mais je ne trouve pas ca très élégant.
 
D'où ma deuxième question :
existe t'il un header definissant une constante dont la valeur est spécifique à chaque OS, sur laquelle je pourrait m'appuyer pour definir ma propre constante de séparateur de chemin.
 
merci

n°1606304
Taz
bisounours-codeur
Posté le 30-08-2007 à 14:41:42  profilanswer
 

g_path_get_basename

n°1606378
tpierron
Posté le 30-08-2007 à 16:20:18  profilanswer
 

Hmm, en fait je suis quasiment sur que cette constante n'existe pas pour la raison que je t'ai donné dans ma première réponse : sur Windows, il n'y a pas un mais 2 séparateurs permis. Donc tu auras du mal à tester tous les cas avec une seule définition.

n°1606448
MEI
|DarthPingoo(tm)|
Posté le 30-08-2007 à 17:22:55  profilanswer
 

hmmm... je dit ça comme ça, mais le plus simple ne serait-il pas :
 
- une fonction char getSeparator(char*);
- une constante qui stocke le resultat de getSeparator.
 
Un postulat intelligent :
- Sous DOS/Win un executable est forcement un .EXE (voir .COM)
- Sous Linux en principe y'a pas d'extension.
 
Donc :  
Si arg[0][length(arg[0]) - 5] == '.' Alors Windows
Sinon Linux


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°1606492
Sve@r
Posté le 30-08-2007 à 18:34:30  profilanswer
 

MEI a écrit :

hmmm... je dit ça comme ça, mais le plus simple ne serait-il pas :
 
- une fonction char getSeparator(char*);
- une constante qui stocke le resultat de getSeparator.
 
Un postulat intelligent :
- Sous DOS/Win un executable est forcement un .EXE (voir .COM)
- Sous Linux en principe y'a pas d'extension.
 
Donc :  
Si arg[0][length(arg[0]) - 5] == '.' Alors Windows
Sinon Linux


Déjà faut pas ôter "5" mais "4". Ensuite ce n'est pas parce que ton pgm se nomme "toto.exe" que t'es pas sous Linux...
 
Maintenant il y a plein d'outils qui peuvent te donner le type de ton système en commençant par "uname"...
Et la fonction "strrchr" sera d'un grand secours pour trouver le dernier "/" (ou "\" )...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1606497
MEI
|DarthPingoo(tm)|
Posté le 30-08-2007 à 18:41:02  profilanswer
 

Bon allez j'vais vous montrer comment on code bien en C/C++/etc, parce que là vous etes risible un peu, on est pas en Java, on sais avant l'execution le systeme ciblé.
 

Code :
  1. #ifdef WIN32
  2. const char DIRECTORY_SEPARATOR = '\';
  3. #elif LINUX
  4. const char DIRECTORY_SEPARATOR = '/';
  5. #endif


C'est pas plus compliqué que ça. :lol:
Tu rajoute la directive de compilation a ton makefile, et voilà.

Message cité 1 fois
Message édité par MEI le 30-08-2007 à 18:41:27

---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°1606508
Sve@r
Posté le 30-08-2007 à 19:32:04  profilanswer
 

MEI a écrit :


Code :
  1. #ifdef WIN32
  2. const char DIRECTORY_SEPARATOR = '\';
  3. #elif LINUX
  4. const char DIRECTORY_SEPARATOR = '/';
  5. #endif


C'est pas plus compliqué que ça. :lol:
Tu rajoute la directive de compilation a ton makefile, et voilà.


Le slash fonctionne aussi sous zindow...
 

MEI a écrit :

Bon allez j'vais vous montrer comment on code bien en C/C++/etc


Super. Tu définis une constante là où une macro peut suffire et surtout tu la nommes en majuscules et en plus tu résouds pas tous les cas. Tu es sûr de nous avoir montré tous tes talents C/C++ ??? :sarcastic:


Message édité par Sve@r le 30-08-2007 à 19:44:55

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
mood
Publicité
Posté le 30-08-2007 à 19:32:04  profilanswer
 

n°1606511
MEI
|DarthPingoo(tm)|
Posté le 30-08-2007 à 19:43:02  profilanswer
 

1. J'ai le droit de nommer mes constante en majuscule si je veux.
2. Il peut rajouter autant de directive qu'il veut.
3. C'était une piste, et WIN32 est une directive de tout projet VC++ donc c'est déjà mieux que rien.
4. Le slash dans Windows :lol: Ouai bah tante sous Win9x et reviens. :lol:
 
EDIT : Pour la directive j'ai appliqué la doc du platform SDK moi einh. Apres si c'est pas C++ compliant ca compile sous Windows avec VS2002/2003/2005 et sous Linux avec GCC (plein de version suivant les serveur où je bossais).
 
Enfin toujours est-il que dans les grandes lignes je suis plus dans le vrai que ceux qui tante de detecter ça a l'execution.
 
En .NET/Java ou autres languages interpretés et multiplateforme il est "normal" de vouloir detecter à l'execution l'OS. Mais dans un langage compilé c'est à la compilation qu'on doit choisir c'tout.

Message cité 1 fois
Message édité par MEI le 30-08-2007 à 19:46:04

---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°1606513
Sve@r
Posté le 30-08-2007 à 19:46:02  profilanswer
 

MEI a écrit :

Ouai bah tante sous Win9x et reviens. :lol:


Ouaip, si ma tante en avait ce serait mon oncle...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1606515
MEI
|DarthPingoo(tm)|
Posté le 30-08-2007 à 19:46:38  profilanswer
 

Bah Win32 c'est de Win32S à Vista, par seulement à partir de XP :lol:


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°1606519
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-08-2007 à 19:54:36  profilanswer
 

atshaw a écrit :


ne fonctionne pas car mon objectif est d'analyser argv[0] pour ne récupérer que le nom du binaire et mon pas tout le chemin d'accès : j'analyse la chaine de caractère à reculon et je récupère un pointeur sur le 1er "\" sous Windows ou "/" sous linux.
 


Bah tu remplaces les \ par des / et ensuite le traitement est unique...

Code :
  1. #include <stdio.h>
  2. static void replace (char *s, int old, int new)
  3. {
  4.    int c;
  5.    while ((c = *s) != 0)
  6.    {
  7.       if (c == old)
  8.       {
  9.          *s = new;
  10.       }
  11.       s++;
  12.    }
  13. }
  14. int main (int argc, char **argv)
  15. {
  16.    printf ("%s\n", argv[0]);
  17.    replace (argv[0], '\\', '/');
  18.    printf ("%s\n", argv[0]);
  19.    return 0;
  20. }



C:\dev\forums\console.exe
C:/dev/forums/console.exe
 
Press ENTER to continue.


Message édité par Emmanuel Delahaye le 30-08-2007 à 20:02:32

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1606533
Sve@r
Posté le 30-08-2007 à 20:44:30  profilanswer
 

MEI a écrit :

Bah Win32 c'est de Win32S à Vista, par seulement à partir de XP :lol:


Ben justement => C'est pour ça qu'il ne faut pas oblitérer les slashes sous prétexte qu'on est sous zindow


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1606771
atshaw
Posté le 31-08-2007 à 13:59:38  profilanswer
 

Citation :

Code :
  1. #ifdef WIN32
  2. const char DIRECTORY_SEPARATOR = '\';
  3. #elif LINUX
  4. const char DIRECTORY_SEPARATOR = '/';
  5. #endif



 
+1 pour MEI
 
C'est exactement ce que veux faire et c'est de loin, à mon avis, la manière la plus propre de procéder  ;)  
 
Mais mon problème n'est toujours pas résolu car ce n'est pas d'un exemple dont j'ai besoin mais du nom du header definissant les constantes WIN32 et LINUX.
 
Aller, encore un petit effort et je note le post comme resolu  :)  (ce qui ne m'empêche pas de chercher de mon côté hein, vous inquiétez pas :D)
 
En tous cas merci à tous.

n°1606782
atshaw
Posté le 31-08-2007 à 14:12:40  profilanswer
 

En fait non, en y reflechissant à deux fois, je n'ai pas besoin du nom du header :D
 
Donc merci

n°1606978
atshaw
Posté le 31-08-2007 à 20:35:37  profilanswer
 

En y reflechissant  à trois fois (j'ai un peu de mal) j'en ai besoin du nom de ce header car je doit l'inclure pour que WIN32 ou LINUX soit défini.
 
Toute proposition est la bienvenue.

n°1606979
MEI
|DarthPingoo(tm)|
Posté le 31-08-2007 à 20:39:51  profilanswer
 

Les directive c'est à la compilation.
 
Ca doit etre -D pour gcc de mémoire.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°1606996
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-08-2007 à 21:09:12  profilanswer
 

atshaw a écrit :

En y reflechissant  à trois fois (j'ai un peu de mal) j'en ai besoin du nom de ce header car je doit l'inclure pour que WIN32 ou LINUX soit défini.

 

Toute proposition est la bienvenue.


C'est ton compilateur qui définit automatiquement ces macros (lire la doc : "macros prédéfinies" ou "predefined macros" ).

 

En général, un compilateur Windows définit soit :

 

WINDOWS
_WINDOWS
_windows
WIN32
_WIN32
_win32

 

et un compilateur pour Linux :
linux
_linux
etc.

 

RTMF

 

Sinon, tu peux le faire toi-même avec des définitions globales à passer sur la ligne de commande (-Dxxx). a placer dans le makefile (un par système) ou dans un include séparé du makefile (un par système).

 


Message édité par Emmanuel Delahaye le 31-08-2007 à 21:12:44

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1607014
atshaw
Posté le 31-08-2007 à 22:01:00  profilanswer
 

Bon ca y est, je m'en suis sorti.  :)  
 
Aucun header n'est necessaire. Du coup, je ne vois pas trop comment sont definies "WIN32" et "linux" :??:  
Si quelqu'un à une réponse à cela, je suis intéressé.
Peut être que MEI à tenté d'y répondre mais je n'ai pas compris ce qu'il voulait dire. Actuellement je n'ai pas besoin d'utiliser l'option -D de gcc.
 
A titre d'information pour les personnes se trouvant dans mon cas, le code exact est :
 
pour Windows / linux :
 

Code :
  1. #ifdef WIN32
  2. const char DIRECTORY_SEPARATOR = '\\';
  3. #elif linux
  4. const char DIRECTORY_SEPARATOR = '/';
  5. #endif


 
pour Windows / all unix
 

Code :
  1. #ifdef WIN32
  2. const char DIRECTORY_SEPARATOR = '\\';
  3. #elif unix
  4. const char DIRECTORY_SEPARATOR = '/';
  5. #endif


 
edit : merci à Emmanuel Delahaye pour son explication qui est survenue lorsque je préparait mon post (c'est la faute à la pause casse-croute ;))

Message cité 1 fois
Message édité par atshaw le 31-08-2007 à 22:09:53
n°1607021
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-08-2007 à 22:24:23  profilanswer
 

atshaw a écrit :

Du coup, je ne vois pas trop comment sont definies "WIN32" et "linux" :??:  
Si quelqu'un à une réponse à cela, je suis intéressé.


Quels sont les mots que tu ne comprends pas dans

Citation :

C'est ton compilateur qui définit automatiquement ces macros (lire la doc : "macros prédéfinies" ou "predefined macros" ).



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1607028
atshaw
Posté le 31-08-2007 à 22:55:02  profilanswer
 

Aucuns, ton explication me convient. Mais comme indiqué, j'ai commencé d'ecrire mon message avant que tu ne poste le tiens et je ne l'ai réellement validé qu'après (bien après il est vrai). J'aurais du vérifier que rien avait été posté durant la pose casse-croute :p


Message édité par atshaw le 01-09-2007 à 18:58:20
n°1607056
Joel F
Real men use unique_ptr
Posté le 01-09-2007 à 09:48:59  profilanswer
 

http://predef.sourceforge.net
pour une liste aps crad de macros définis apr els compilateurs

n°1607060
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-09-2007 à 10:02:26  profilanswer
 

Joel F a écrit :

http://predef.sourceforge.net
pour une liste aps crad de macros définis apr els compilateurs


Enorme ! Merci, j'avais perdu ce lien.
 
Au fait, on dirait que certains de tes doigts sont branchés à l'envers !


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1607132
Joel F
Real men use unique_ptr
Posté le 01-09-2007 à 19:01:29  profilanswer
 

gaucher contrarié tout ça :o ma main gauche va + vite que la droite

n°1607135
atshaw
Posté le 01-09-2007 à 19:07:37  profilanswer
 

Extra la liste, c'est exactement ce que je cherchais.  
Même si je n'en ai plus besoin pour le moment ça peut toujours servir pour plus tard...

n°1607185
Joel F
Real men use unique_ptr
Posté le 02-09-2007 à 01:16:07  profilanswer
 

comme dirait l'autre, ca m'a suavé ma vie (c) :o
Quand je pense au bordel moche que je foutais dans mes makefile avant de découvrir cette page :sweat:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [résolu] separateur de chemin : existe t'il une constante?

 

Sujets relatifs
[RESOLU] WindowsMediaPlayer[Flash-html] Musique player RESOLU
[Résolu] Restaurer pop-up jssimplexml object dans un tableau: asXML n'existe plus :s
[résolu] Random page promo[RESOLU] Mettre en pause une animation flash
[RESOLU] mail() smtp php.ini[VBA]Comparaison de chaines suite à un tri. [RESOLU]
Mon COOKIE revient par defaut [RESOLU]Probleme COOKIE site multi langue[RESOLU]
Plus de sujets relatifs à : [résolu] separateur de chemin : existe t'il une constante?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR