Suppression de caractères (extension) dans une chaine C++

Résolu
klitzounet Messages postés 28 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 15 mai 2009 - 5 déc. 2007 à 16:00
BruNews Messages postés 21040 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.

18 réponses

klitzounet Messages postés 28 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 15 mai 2009
5 déc. 2007 à 21:53
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é
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 déc. 2007 à 16:23
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++
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
5 déc. 2007 à 16:28
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
0
klitzounet Messages postés 28 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 15 mai 2009
5 déc. 2007 à 16:43
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
0

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

Posez votre question
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
5 déc. 2007 à 16:51
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
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
5 déc. 2007 à 16:52
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
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
5 déc. 2007 à 16:53
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 déc. 2007 à 16:55
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++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 déc. 2007 à 16:58
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++
0
klitzounet Messages postés 28 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 15 mai 2009
5 déc. 2007 à 17:04
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
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
5 déc. 2007 à 17:08
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
0
klitzounet Messages postés 28 Date d'inscription mercredi 8 novembre 2006 Statut Membre Dernière intervention 15 mai 2009
5 déc. 2007 à 17:20
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 déc. 2007 à 17:32
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++
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
5 déc. 2007 à 17:34
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
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
5 déc. 2007 à 17:36
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 déc. 2007 à 17:37
SUR !!! à rajouter, merci.

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
5 déc. 2007 à 17:39
wfd.cFileName est un buffer perso du prog, on y écrit ce que l'on veut.

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
5 déc. 2007 à 22:08
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++
0
Rejoignez-nous