Suppression de caractères (extension) dans une chaine C++ [Résolu]

Messages postés
28
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
15 mai 2009
- - Dernière réponse : BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
- 5 déc. 2007 à 22:08
Bonjour
J'ai un code C++ qui fonctionne parfaitement (j'ai travaillé longtemps à partir d'une source -> je suis plutôt débutant, pour réussir à l'adapter à mes besoins et m'en servir convenablement) seulement j'aimerais ajouter une fonction que je n'ai pas réussi à comprendre dans les forums.
C'est tout simplement le suppression de 4 caractères à la fin d'un chaine (ici l'extension des fichiers).
En php c'est SUBSTR en C++ c'est STRST (je crois quelque chose comme ca) mais je ne m'en sort pas
Pouvez vous m'aider à comprendre stp ?
Voici mon code :

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//fait la liste des fichiers d'un repertoire et l'enregistre dans un fichier xml
int main() {



 HANDLE hfind;
 WIN32_FIND_DATA wfd;
 char **tab; int i=0;
 



    char szAppPath[ MAX_PATH ] = "";
    char chemin[MAX_PATH] = "";

 //recherche du path du repertoire courant
    GetModuleFileName( 0, szAppPath, sizeof( szAppPath ) - 1 );
    printf("szapp  %s\n", szAppPath);
    //découpage de la partie qui nous intéresse (sans le nom listFiles.exe)
    for(i=0;i<strlen(szAppPath)-14;i++) {
            chemin[i] = szAppPath[i];
    }
    szAppPath[i] = '\0';
 
 //ouverture du fichier xml à editer
    FILE *f = fopen(strcat(chemin, "
[file://listfiles.xml/
\\listFiles.xml
]
"), "w+");
    fprintf(f, "<database>\n");




 // Liste le contenu du répertoire

 hfind = FindFirstFile (strcat(strcpy(chemin, szAppPath), "

\\\\

*.* "), &wfd ); 
 if (hfind != INVALID_HANDLE_VALUE) {
  do{
              // vérifie si c'est un répertoire ou non
              if (!( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )) {
                  fprintf(f, "\t\n", wfd.cFileName);
              }
              i++;



  }while(FindNextFile( hfind, &wfd));
  FindClose(hfind);
 }



 fprintf(f, "</database>");



   //fermeture du fichier
   fclose(f);
  
   return 0;
}


Voila ! c'est la phrase en rouge qu'il faudrait modifier je pense pour réussir à supprimer les 4 derniers caractères de la chaine (ex: .mp3)
J'attend des réactions  Merci d'avance à bientôt.
Afficher la suite 

18 réponses

Meilleure réponse
Messages postés
28
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
15 mai 2009
3
Merci
Merci beaucoup à Buno !!!!!
Il à réussi à me dicter (c'est le mot) la solution :

              // vérifie si c'est un répertoire ou non
              if (!( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )) {
                     // supprime l'extension avec le "." (4 caractères)
                     char *P=wfd.cFileName;
                     while(*P!='\0')P++;
                     P-=4;
                     *P='\0';
                     // inscris la ligne d'indexation du fichier trouvé
                    fprintf(f, "Fichier mp3=%s \n", wfd.cFileName);

-> Ce qui est en vert est la solution qu'il m'a apporté

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 199 internautes nous ont dit merci ce mois-ci

Commenter la réponse de klitzounet
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
Par définition, une chaine C finit au 1er zéro rencontré donc tu mets 0 là où tu veux qu'elle finisse.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
Salut
Tu parcours toute ta chaine avec un pointeur:
char *P;
P=szPath;
while(P!='\0')P++;

et tu recules de 4 position et tu met un \0
P-=4;
*P='\0';

A+
Mon site internet : http://pistol.petesampras.free.fr
Commenter la réponse de Pistol_Pete
Messages postés
28
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
15 mai 2009
0
Merci
Merci pour vos réponses si rapides mais je ne comprend pas très bien ...
Deja je pense que ce qu'a dit BruNews ne fonctionnera pas car mettre un 0 dans ma ligne
fprintf(f, "\t\n", wfd.cFileName);
ne devrait pas aller je crois ^^. En plus je le met où ce 0 ?? :S Si je l'insère entre les "" cela va l'afficher dans le résultat final.

La réponse de Pistol_Pete me paraît plus appropriée car le positionnement du pointeur est ce que je recherche mais je ne comprend pas non plus ce que tu me demande de faire :S Désolé j'ai prévenu que j'étais plutôt débutant (pas nul non plus mais pas expert ).

Si c'est possible et réalisable (accumulation de 2 mots équivalent pour inssister sur le fait :P ) j'aimerais que quelqu'un me fasse un exemple tout simple.
Par exemple la commande pour afficher "Bonjour vous" mais lors de l'execution, supprimer le " vous" pour qu'il ne reste que "Bonjour".
En C++ biensur ^^ je pense que quelqu'un de calé sur le sujet ne devrais pas trop perdre de temps à réfléchir la-dessus

Merci
Commenter la réponse de klitzounet
Messages postés
14685
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 décembre 2019
90
0
Merci
Yop!
A mon tour de proposer une solution:

char *pos=strrchr(taChaine, '.');    // Recherche du point avant l'extension, cad, la dernière occurence du point
*pos=0;   // Mettre 0 comme l'a dit BruNews

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Commenter la réponse de BunoCS
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
0
Merci
Ben voila
char szPath[20]="Bonjour vous";
char *P=szPath;
while(*P!='\0')P++;      //tu te places en fin de chaine

P-=5;           //tu te places à l'endroit ou tu veux couper
*P='\0';      //et tu coupes
printf("%s\n",szPath);   //tu affiches bonjour

PS: je te propose exactement la meme méthode que Brunews

Mon site internet : http://pistol.petesampras.free.fr
Commenter la réponse de Pistol_Pete
Messages postés
14685
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 décembre 2019
90
0
Merci
A savoir qu'une extension n'est pas limitée à 3 caractères....

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Commenter la réponse de BunoCS
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
On a dit tous les 2 la même chose, le 0 va dans la chaine et non dans une commande (fprintf ou autre).

char *c = LaChaineQueTuVeuxTronquer;
while(*c) c++; // EST SUR 0 DE FIN DE CHAINE
if((c - LaChaineQueTuVeuxTronquer) >= 4) { // VERIF SI ON PAUT ALLER 4 EN ARRIERE
  *(c-4) = 0; // CHAINE TRONQUEE DE 4 CARACTERES
}

Maintenant tu peux envoyer la chaine où tu veux.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
c'est clair qu'une extension n'est pas de 4 à tout coup mais vu le niveau débutant, vaut mieux s'en tenir là sinon que donnerait ta solution avec:
d:\mon.dossier\readme
un '.' dans dossier et pas d'extension au fichier...

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
28
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
15 mai 2009
0
Merci
Merci de me considérer comme tel ! je ne suis pas abrutis au point de ne pas connaitre mes extensions :) Je suis peut-être grand débutant en C++ mais pas sur d'autres sujets en informatique. Bref ce n'est pas le thème. Merci encore de tous avoir répondu.

Je teste tout de suite vos différentes propositions... je donne de mes nouvelles plus tard
Commenter la réponse de klitzounet
Messages postés
14685
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 décembre 2019
90
0
Merci
BruNews > Le résultat serait inexploitable, bien sûr....mais c'est idem dans votre solution, non?
En tout cas, maintenant, notre ami devrait s'en sortir...
D'ailleurs, inutile de cliquer sur "Réponse Acceptée" à chaque réponse

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Commenter la réponse de BunoCS
Messages postés
28
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
15 mai 2009
0
Merci
C'est vrai ??  Je pensais qu'il fallait le faire à chaque fois pour faire marcher le forum -> donner des points à ceux qui postent. Mais si c'est pas utile tant mieux parce que c'est pénible à faire

En tout cas merci Buno tes réponses me parraissent les meilleures ;) Penses-tu pouvoir combiner :
char szPath[20]="Bonjour vous";
char *P=szPath;
while(*P!='\0')P++;
P-=5;
*P='\0';
printf("%s\n",szPath);
avec
fprintf(f, "Fichier mp3=%s \n", wfd.cFileName);

Par exemple
Commenter la réponse de klitzounet
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
C'est sur que c'est inexploitable en prod, j'ai bien dit "on s'en tiendra là".

char *EnleverExtension(char fzpath)
{
  char *c = fzpath, *d;
  while(*c) c++;
  d = c;
  while(--d > fzpath) { // SINON ON SORT SANS TOUCHER
    if(*d == '\\') break; // IDEM PAS TOUCHE
    if(*d == '.') { // YOUPI EXTENSION TROUVEE
      *d = 0;
      c = d;
      break; // STOP, TRAVAIL FINI
    }
  }
  return c;
}


Pointeur sur fin de chaine est retourné, permettra d'y mettre une extension perso ou autre si besoin sans reparcours de la chaine.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
14685
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 décembre 2019
90
0
Merci
Yep, je ne vois pas de souci. Si ce n'est que tu ne puisses pas modifier la variable wfd.cFileName. Je te conseille donc de la mettre dans une chaine.

NB: Je ne pense pas que la "réponse acceptée" apporte plus de points à celui qui la donne . ça sert sourtout si quelqu'un, plus tard, à le même problème que toi: il cherche la case verte pour trouver la réponse...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Commenter la réponse de BunoCS
Messages postés
14685
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
12 décembre 2019
90
0
Merci
BruNews > Il ne manquerais pas l'étoile dans le paramètre de ta fonction?

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Commenter la réponse de BunoCS
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
SUR !!! à rajouter, merci.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
wfd.cFileName est un buffer perso du prog, on y écrit ce que l'on veut.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
Je te fournis la fonction clé en main, tu pourrais au moins t'en servir:


EnleverExtension(wfd.cFileName);
fprintf(f, "Fichier mp3=%s \n", wfd.cFileName);

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews