Extraire à partir d'un chemin complet de fichier seulement le nom ... ?

Signaler
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
-
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
-
Bonjour tout le monde

donc la question est pas compliqué je pense, j'ai un chemin du style " C:\temp\file.cpp", et je veux juste "file"
Je suppose que ca doit pas etre bien compliqué, en tout cas sur les sources données ici j'ai rien trouvé de très convaincant. J'ai essayé de le faire moi meme en reprennant le modèle d'une source qui retirait juste le répertoire, mais sans grand succès...

en gros, existerait-il une fonction, dans l'API, ou autre part ? Ou encore faite si gentillement par vous ?

Merci

10 réponses

Messages postés
15192
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 décembre 2021
101
Tu pars de la fin de ta chaine de caractères et tu rechercher un point "."
Ensuite, tu continue à remonter jusqu'au slash ""
Le nom de ton fichier est compris entre les 2 pointeurs.

Ceci est la méthode générale. Quel langage utilises-tu?

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Le C++, ou C, enfin je n'y vois pas de différence, ici en tout cas ; et je code sous Dev-C++

J'ai essayé une fonction que voici :

char * ExtractFileName(char * szFileName)
{
char buf[264];
char *c, *b;
c = szFileName;
b = buf;

while(*c != '.')c++;
if(*c == '.')
{
while(*c != '\\')c--;
if(*c == '\\')
{
c++;
while(*b = *c){c++; b++;}
while(*b != '.') b--;
*b = 0;
}
}
cout << buf << endl;
return buf;
}

Elle marche, ou du moins, la ligne en rouge marche, mais à l'intérieur de la fonction seulement. Dés que j'essaie de retourner la valeur du buffer, soit ca m'affiche un as de pique (??), soit la première ligne si je change :
char * ExtractFileName(char * szFileName) en char ExtractFileName(char * szFileName)
et : return buf; en return * buf;

Je ne comprends pas bien ces changements je l'avoue, j'ai juste bidouiller pour voir si ca marche, mais non...
Alors comment faire pour retourner le buffer ? Je ne pense pas qu'il y ait d'erreurs dans mon code
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
1
char buf[264];

buf n'est plus valide quand la fonction se termine.

soit tu met en static soit tu alloue avec malloc.
Messages postés
15192
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 décembre 2021
101
Je préfère la méthode de passer la chaine de retour en paramètres:
void ExtractFileName(char * path, char * file);

en ayant pris soin d'allouer file avant d'entrer dans la fonction

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Et aussi, c'est normal que le compilateur me signal l'erreur "Missing terminating ' character" quand je mets :

while(*c != '\')c--;
if(*c == '\')

au lieu de :

while(*c != '\\')c--;
if(*c == '\\')

?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
'\' est carac d'échappement, faut le doubler

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Oui en static ca marche, merci beaucoup ! Montenant pour mon histoire slashes s'il vous plait ? sans trop vous bruscer bien sur hein
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

J'avais pas vu ta réponse BruNews dsl, oui je l'ai fait doubler, mais est-ce normal que le chemin complet de mon fichier doit lui aussi avoir à chaque fois des double slashe ?
comme ca :
"C:\\mes docs\\musique\\machin.mmm"
et que ca bugge quand je n'en met qu'un chaque fois ?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Toujours doublé dans une constante, c'est un caractère d'échappement comme dit plus haut.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Donc tout va bien, merci :)