Supprimer l'extension

[Résolu]
Signaler
Messages postés
111
Date d'inscription
mardi 18 septembre 2007
Statut
Membre
Dernière intervention
29 décembre 2008
-
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
-
Bonjour,
Je voudrais supprimer uniquement l'extension d'un fichier.

Exemple :
Char test[64]="C:\\XXX\\WWW\\FFF.txt";
strtok(test, ".");
SetWindowText(GetDlgItem(hdlg,IDC_EDIT1),test)
J'obtiens bien : C:\XXX\WWW\FFF

Le problème, c'est si il y a plusieurs « . », ça ne fonctionne plus.
Comme : "C:\\XXX\\WW.W\\FFF.txt"

Il y a-t-il moyen de résoudre le problème et comment ?
Merci beaucoup
@+

9 réponses

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Bonjour,

Il faut rechercher le premier "." à partir de la fin et le remplacer par un 0 terminateur.

for (int i=strlen(test)-1 ; i>=0 ; --i)
{
   if (test[i] == '.')
   {
      test[i] = 0;
      break; // trouvé
   }
}

Jean-François
Messages postés
111
Date d'inscription
mardi 18 septembre 2007
Statut
Membre
Dernière intervention
29 décembre 2008

bonjour,
ok, ça fonctionne.
merci Jean-François
@+
Messages postés
123
Date d'inscription
samedi 14 juillet 2007
Statut
Membre
Dernière intervention
29 mars 2009
1
C'est surtout une horreur.
Réviser (ou apprendre) les bases du C pour utiliser les fonctions standards : strrchr () notamment
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Bien sûr ! Monter toute une usine à gaz avec strchr() pour chercher la dernière occurence d'un caractère ! Ca c'est bigrement efficace et parlant !


Comment voulez-vous que strchr() s'arrête sur la dernière occurence d'un caractère sans aller jusqu'au bout de la chaîne pour constater que c'était bien la dernière occurence ?

Aller jusqu'au bout de la chaîne, c'est ce que fait, très rapidement, strlen() pour compter les caractères et ensuite il n'y a plus qu'à faire un minimum de reculs jusqu'au dernier ".". Et tout ça peut être encore optimiser avec un petit pointeur de caractères !



Jean-François
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Le cas où strrchr (ou équivalent) pourrait être plus performant est si l'occurrence recherchée se trouve avant la moitié de la chaine ou encore, si elle n'existe tout simplement pas dans la chaine.
Autrement, la méthode proposé par jfrancois est la plus rapide.

Par exemple, sur un chaine de 20 caractères + 0 de fin de chaine, strrchr devra faire 41 tests.
La méthode de jfrancois ira jusqu'au 0 de fin de chaine (21 tests) puis reviendra. Si l'extension est .exe, on ajoutera 8 tests.
29 tests en tout.
Cependant, si l'extension est avant la moitié de la chaine ou n'existe pas, on dépassera les 41 tests.

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
"Cependant, si l'extension est avant la moitié..."
-> Cependant, si l'occurence est avant la moitié...

C++ (@++)<!--
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
D:\mon.dossier\test.txt


jeffy131 :
Tu penses trouver le bon résultat avec ta fonction 'standard' ???
Faudrait arrêter de balancer des remarques sentencieuses, une horreur standard n'en reste pas moins une horreur quand le résultat est faux.

void DelExt(char *f)
{
  while(*f) f++;  while(*--f !'\\') if(*f '.') {*f = 0; break;}
}
Tout comme pour autre fonction de chaine, l'utilisateur est prié de passé un FICHIER, ce qui implique qu'il y a au moins un '\\' dedans sinon badaboum.
strlen() et autres (C standard) font ainsi pour efficacité. Un dev C est une personne responsable sinon on va faire du VB.

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
OUPS,
pour jeffy131, tester strrchr() avec D:\mon.dossier\test

un fichier n'a pas obligatoirement une extension et un dossier peut contenir un '.'.

ciao...
BruNews, MVP VC++
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Bonjour,

Pour tenir compte du cas (pas très fréquent mais pas rare non plus !) évoqué par BruNews où :
- le fichier n'a pas d'extension
- le chemin d'accès contient un répertoire avec un "."



Et en oubliant pas qu'il est possible d'utiliser le '/' à la place du '\\'
dans les noms de fichiers (excepté avec certaines fonctions comme system() où la chaîne est passée au système qui, lui, ne comprend pas les '/'). Exemple : "D:\\mon.dossier\\test.txt" = "D:/mon.dossier/test.txt" = "D:\\mon.dossier/test.txt" = "D:/mon.dossier\\test.txt".



for (int i=strlen(test)-1 ; i>=0 && test[i]!='\\' && test[i]!='/' ; --i)
{
   if (test[i] == '.')
   {
      test[i] = 0;
      break; // trouvé
   }
}





Jean-François