Supprimer l'extension

Résolu
F0ra Messages postés 111 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 29 décembre 2008 - 2 mai 2008 à 20:28
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 - 3 mai 2008 à 13:45
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

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
2 mai 2008 à 20:38
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
3
F0ra Messages postés 111 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 29 décembre 2008
2 mai 2008 à 20:43
bonjour,
ok, ça fonctionne.
merci Jean-François
@+
0
jeffy131 Messages postés 123 Date d'inscription samedi 14 juillet 2007 Statut Membre Dernière intervention 29 mars 2009 1
2 mai 2008 à 20:59
C'est surtout une horreur.
Réviser (ou apprendre) les bases du C pour utiliser les fonctions standards : strrchr () notamment
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
2 mai 2008 à 22:09
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 mai 2008 à 22:34
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++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 mai 2008 à 22:36
"Cependant, si l'extension est avant la moitié..."
-> Cependant, si l'occurence est avant la moitié...

C++ (@++)<!--
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 mai 2008 à 10:47
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++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 mai 2008 à 13:21
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++
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
3 mai 2008 à 13:45
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
0
Rejoignez-nous