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)

vendredi 2 mai 2008 à 20:28:25 | supprimer l'extension

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

vendredi 2 mai 2008 à 20:38:09 | Re : supprimer l'extension

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


vendredi 2 mai 2008 à 20:43:37 | Re : supprimer l'extension

F0ra

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

vendredi 2 mai 2008 à 20:59:08 | Re : supprimer l'extension

jeffy131

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

vendredi 2 mai 2008 à 22:09:09 | Re : supprimer l'extension

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


vendredi 2 mai 2008 à 22:34:06 | Re : supprimer l'extension

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


vendredi 2 mai 2008 à 22:36:15 | Re : supprimer l'extension

SAKingdom

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

C++ (@++)


samedi 3 mai 2008 à 10:47:17 | Re : supprimer l'extension

BruNews

Administrateur CodeS-SourceS

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


samedi 3 mai 2008 à 13:21:05 | Re : supprimer l'extension

BruNews

Administrateur CodeS-SourceS
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++

samedi 3 mai 2008 à 13:45:03 | Re : supprimer l'extension

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




Cette discussion est classé dans : test, supprimer, extension, xxx, fff


Répondre à ce message

Sujets en rapport avec ce message

Supprimer doublons [ par lombredudragon ] Voila j'ai un fichier texte contenant des adresses mails.De ce style =>marcel@xxx.comdede@xxx.comjosé@xxx.comDans ce fichier , on est sur qu'il y a de Problème avec for [ par Scientophage ] J'ai un gros problème avec l'instruction for quand je tapeint test[5];for (int a=0; a==4; a++){ test[a]=a; coutCa ne m'affiche rien et en plus test sur variable de type char [ par enrageur ] j'aimerais indetifier des mots dans un fichier txt. J'ouvre le fichier et je le copy dans un char (data). Ensuite je fais un test pour voir si les deu algorithme de test sur arbre binaire parfait [ par tapas64 ] Bonjour,je cherche un algorithme qui me permettrait de tester si un arbre binaire est parfait. Je n'ai rien trouvé en surfant sur le net ou e essayant Vector Erase : problème [ par Clonk ] Bonjour,Voilà mon problème, j'utilise un vector pour gérer des aretes d'une figure géométrique, à un moment, je veux supprimer certains éléments dans supprimer objet de type BITMAP [ par tdeco ] SalutJ'utilise un objet de type BITMAP que je cré à partir d'un buffer et que j'affiche par la suite.Il y a t-il un moyen de supprimer cet objet après Conversion str en char [ par bthivent ] Bonjour !J'aimerai en faite faire une message box : MessageBox(NULL, message, "Connexion", MB_YESNO) avec dedans une message spéciale...je sais que ma Savoir quand un utilisateur à supprimer un fichier ? [ par nicolos ] Salut,J'aimerais bien savoir coment intercepter le message de suppression d'un fichier ? Et ainsi permettre son autorisation de suppression ou non. To test du pointeur [ par jeltimed ] bonjour .en fait je suis débutant en c++ et je voulais juste savoir est ce que ya moyen d'appliquer la logique suivant en c++: si pointeur pointe Supprimer icône Fermer [ par larion ] Bonjour, Sur mon application, je souhaite supprimer l'icône Fermé [X] dans la barre de titre, pour ne laisser que l'icône Minimisé.Comment fait-on ? M


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

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



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,546 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.