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

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

Marsh Posté le 29-08-2007 à 22:13:04    

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
Reply

Marsh Posté le 29-08-2007 à 22:13:04   

Reply

Marsh Posté le 29-08-2007 à 23:02:18    

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

Reply

Marsh Posté le 30-08-2007 à 09:48:05    

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

Reply

Marsh Posté le 30-08-2007 à 14:36:29    

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

Reply

Marsh Posté le 30-08-2007 à 14:41:42    

g_path_get_basename

Reply

Marsh Posté le 30-08-2007 à 16:20:18    

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.

Reply

Marsh Posté le 30-08-2007 à 17:22:55    

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 |
Reply

Marsh Posté le 30-08-2007 à 18:34:30    

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.
Reply

Marsh Posté le 30-08-2007 à 18:41:02    

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 |
Reply

Marsh Posté le 30-08-2007 à 19:32:04    

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.
Reply

Marsh Posté le 30-08-2007 à 19:32:04   

Reply

Marsh Posté le 30-08-2007 à 19:43:02    

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 |
Reply

Marsh Posté le 30-08-2007 à 19:46:02    

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.
Reply

Marsh Posté le 30-08-2007 à 19:46:38    

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 |
Reply

Marsh Posté le 30-08-2007 à 19:54:36    

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/
Reply

Marsh Posté le 30-08-2007 à 20:44:30    

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.
Reply

Marsh Posté le 31-08-2007 à 13:59:38    

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.

Reply

Marsh Posté le 31-08-2007 à 14:12:40    

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

Reply

Marsh Posté le 31-08-2007 à 20:35:37    

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.

Reply

Marsh Posté le 31-08-2007 à 20:39:51    

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 |
Reply

Marsh Posté le 31-08-2007 à 21:09:12    

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/
Reply

Marsh Posté le 31-08-2007 à 22:01:00    

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
Reply

Marsh Posté le 31-08-2007 à 22:24:23    

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/
Reply

Marsh Posté le 31-08-2007 à 22:55:02    

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
Reply

Marsh Posté le 01-09-2007 à 09:48:59    

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

Reply

Marsh Posté le 01-09-2007 à 10:02:26    

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/
Reply

Marsh Posté le 01-09-2007 à 19:01:29    

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

Reply

Marsh Posté le 01-09-2007 à 19:07:37    

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...

Reply

Marsh Posté le 02-09-2007 à 01:16:07    

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:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed