F0ra
Messages postés111Date d'inscriptionmardi 18 septembre 2007StatutMembreDernière intervention29 décembre 2008
-
2 mai 2008 à 20:28
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDerniè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
@+
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 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".