Bonjour,
Imaginons que nous avons un chemin de fichier et que nous nous intéressions qu'à son nom (sans le chemin)
exemple: soit le chemin suivant,
L'objectif sera d'avoir le résultat suivant,
En python on fera cela simplement
En bash,
On va donc créer une implémentation de cette fonction (basename) en C, mais vous inquiétez pas, je ne vais pas vous laisser sans aide
LES DIFFÉRENTES ÉTAPES
Nous aurons besoin de passer par plusieurs étapes
PORTABILITÉ DU CODE
Afin de ne pas faire de jaloux, nous allons rendre ce code compatible Unix et Windows, car comme vous le savez les chemins de fichiers ne sont pas de la même forme
C:\Utilisateurs\fred1599\test.txt -> Windows
/home/fred1599/test.txt -> Unix
La différence entre les deux à part le chemin, c'est que le séparateur sous Windows est le caractère '\', alors que sous Unix c'est le caractère '/'.
On va donc prévenir notre programme en détectant l'OS sur lequel on compilera notre code final, à l'aide de quelques lignes préprocesseur
Dorénavant pour détecter le caractère '\' ou '/' nous aurons juste à utiliser la variable SEP.
LA FONCTION BASENAME
On vient à l'essentiel, notre fonction ne retourne rien, et doit entrer le résultat final dans une variable nommée resultat, sa signature sera,
C'est bien beau, mais comment je détecte le dernier caractère SEP ?
Comment tester ?
Voici le main suivant que vous soyez sous Windows ou Unix
Windows:
Unix:
Le main
SQUELETTE FINAL
Voici le squelette du programme
Pour les balèzes en C, vous pouvez utiliser l'allocation dynamique et faire le boulot avec une construction du type
Bonne continuation...
Réponse par MP, merci par avance !
À bientôt
Imaginons que nous avons un chemin de fichier et que nous nous intéressions qu'à son nom (sans le chemin)
exemple: soit le chemin suivant,
Code:
/home/fred1599/fichier.txt
Code:
fichier.txt
Code:
>>> PATH = "/home/fred1599/fichier.txt" >>> import os.path >>> os.path.basename(PATH) 'fichier.txt'
Code:
[email protected]:~$ basename '/home/fred1599/test.txt' test.txt
LES DIFFÉRENTES ÉTAPES
Nous aurons besoin de passer par plusieurs étapes
- Rendre le code portable, pas besoin de vous en inquiéter je m'en occupe pour vous
- Créer une fonction basename, prenant en argument le chemin du fichier à tronquer (path) et la chaîne resultat (contenant le résultat test.txt)
PORTABILITÉ DU CODE
Afin de ne pas faire de jaloux, nous allons rendre ce code compatible Unix et Windows, car comme vous le savez les chemins de fichiers ne sont pas de la même forme
C:\Utilisateurs\fred1599\test.txt -> Windows
/home/fred1599/test.txt -> Unix
La différence entre les deux à part le chemin, c'est que le séparateur sous Windows est le caractère '\', alors que sous Unix c'est le caractère '/'.
On va donc prévenir notre programme en détectant l'OS sur lequel on compilera notre code final, à l'aide de quelques lignes préprocesseur
Code:
#ifdef WIN32 #define SEP 92 /* nombre ascii représentant le caractère '\' */ #elif defined (unix) #define SEP 47 /* nombre ascii représentant le caractère '/' */ #endif
LA FONCTION BASENAME
On vient à l'essentiel, notre fonction ne retourne rien, et doit entrer le résultat final dans une variable nommée resultat, sa signature sera,
Code:
void basename(char *path, char *resultat);
- On récupère l'index du dernier caractère SEP
- De l'index récupéré on ajoute dans resultat tous les caractères allant de path[index+1] jusqu'au caractère de fin de path, c'est à dire '\0'
- On ajoute le caractère de fin '\0' à resultat
Comment tester ?
Voici le main suivant que vous soyez sous Windows ou Unix
Windows:
Code:
char myPath[] = "C:\\Utilisateurs\\fred1599\\test.txt";
Unix:
Code:
char myPath[] = "/home/fred1599/test.txt";
Code:
int main(void) { char myPath[] = /* À compléter par la chaîne ci-dessus selon votre OS ... */ char resultat[200]; basename(myPath, resultat); printf("%s\n", resultat); getchar(); /* pause pour Windows, compatible Unix */ return 0; }
Voici le squelette du programme
Code:
#include <stdio.h> #include <stdlib.h> #ifdef WIN32 #define SEP 92 #elif defined (unix) #define SEP 47 #endif void basename(char *path, char *resultat); int main(void) { char myPath[] = "/home/fred1599/test.txt"; char resultat[200]; basename(myPath, resultat); printf("%s\n", resultat); /* Affichage du résultat */ getchar(); return 0; } void basename(char *path, char *resultat) { /* code à compléter */ }
Code:
char *basename(char *path);
Réponse par MP, merci par avance !
À bientôt