begin process at 2008 07 05 00:52:27
1 205 023 membres
12 nouveaux aujourd'hui
14 118 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : supprimer l'extension [ Divers / Débutant(e) ] (F0ra)

supprimer l'extension le 02/05/2008 20:28:25

F0ra
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
@+

Re : supprimer l'extension le 02/05/2008 20:38:09

jfrancois
Réponse acceptée !
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


Re : supprimer l'extension le 02/05/2008 20:43:37

F0ra
bonjour,
ok, ça fonctionne.
merci Jean-François
@+

Re : supprimer l'extension le 02/05/2008 20:59:08

jeffy131
C'est surtout une horreur.
Réviser (ou apprendre) les bases du C pour utiliser les fonctions standards  : strrchr () notamment

Re : supprimer l'extension le 02/05/2008 22:09:09

jfrancois

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


Re : supprimer l'extension le 02/05/2008 22:34:06

SAKingdom
Membre Club
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++ (@++)


Re : supprimer l'extension le 02/05/2008 22:36:15

SAKingdom
Membre Club
"Cependant, si l'extension est avant la moitié..."
-> Cependant, si l'occurence est avant la moitié...

C++ (@++)


Re : supprimer l'extension le 03/05/2008 10:47:17

BruNews
(Admin CS)

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


Re : supprimer l'extension le 03/05/2008 13:21:05

BruNews
(Admin CS)
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++

Re : supprimer l'extension le 03/05/2008 13:45:03

jfrancois
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



Classé sous : test, supprimer, extension, xxx, fff

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS