Garder un mot d'une string

Garder un mot d'une string - C++ - Programmation

Marsh Posté le 13-01-2007 à 21:36:57    

Salut tout le monde!!
 
J'suis en train de faire un programme qui à un moment permet de choisir un fichier et donc d'afficher le chemin d'accès à celui-ci dans une textbox (je suis sous visual c++).
 
Le chemin d'accès est donc affiché sous la forme "C:\...\mon dossier\mon fichier" et est stocké dans une string.Je voudrais extraire le nom du fichier pour le mettre dans une requète ftp (ça marche comme ça mais ce sera plus propre).
 
Il faut donc un code qui analyse la string en cherchant le caractère "\" et que ce code renvoi dans une autre string ce qui se trouve après le dernier "\".
 
Je vois le truc mais j'arrive pas à le coder...Quelqu'un peut m'aider s'il vous plait?
 
@++

Reply

Marsh Posté le 13-01-2007 à 21:36:57   

Reply

Marsh Posté le 13-01-2007 à 21:38:34    

boost::tokenizer  

Reply

Marsh Posté le 13-01-2007 à 21:51:38    

salut, ba il y aurait aussi la méthode find() de la classe String...  
ce site devrais t'aider :
http://www.sgi.com/tech/stl/basic_string.html
 
[edit] je viens de voir le boost::tokenizer ba c'est clairement plus efficace, sans aucune comparaison :D  

Message cité 1 fois
Message édité par Amonchakai le 13-01-2007 à 21:57:01
Reply

Marsh Posté le 13-01-2007 à 22:38:35    

Joel F a écrit :

boost::tokenizer


 

Amonchakai a écrit :

salut, ba il y aurait aussi la méthode find() de la classe String...  
ce site devrais t'aider :
http://www.sgi.com/tech/stl/basic_string.html
 
[edit] je viens de voir le boost::tokenizer ba c'est clairement plus efficace, sans aucune comparaison :D


 
Merci les gars!!
 
Je regarde ça et je vous tiens au courant!


Message édité par pedro001 le 13-01-2007 à 22:51:14
Reply

Marsh Posté le 14-01-2007 à 13:34:50    

Code :
  1. string chemin, fichier;
  2. int    x;
  3. x = chemin.find_last_of('\\', chemin.length()) + 1;
  4. fichier = chemin.substr(x, chemin.length()-x);


 
"chemin" etant le chemin complet d'acces au fichier


Message édité par youplab00m le 14-01-2007 à 13:35:46
Reply

Marsh Posté le 14-01-2007 à 21:06:52    

merci beaucoup pour ton code!
 
mais y'a un soucis:j'ai essayé de rentrer "c:\mes documents\toto.txt"
 
et il m'a sortit comme nom de fichier "mes"...
 
de plus je comprends pas la ligne "x = chemin.find_last_of('\\', chemin.length()) + 1;" : pourquoi avoir mis '\\' et pas simplement '\'?C'est bien ça le caractère délimiteur non?
 
Edit:en fait le programme ne gère pas les espaces c'est ça le soucis..
 
Merci bien de m'aider en tous cas!!
 
@++


Message édité par pedro001 le 14-01-2007 à 23:14:17
Reply

Marsh Posté le 15-01-2007 à 05:00:09    

Ben en fait je l'ai teste sous linux et ca marche, qu'il y ai des espaces ou pas dans chemin.
Le \\ c'est parceque \ seul est un caracter special. Peut-etre que sous Windows c'est different...

Reply

Marsh Posté le 15-01-2007 à 18:48:02    

Ouai j'ai essayé un seul sous windows bah ça marche pas :ça reconnait tout ce qui suit comme du texte.
 
Et personne à une idée pour que les espaces ne soient plus un caractère délimiteur?

Reply

Marsh Posté le 15-01-2007 à 19:45:42    

salut,
   Ben j'avoue que je suis assez perplexe : le code de Youplab00m fonctionne chez moi... il n'y a pas de problème si je rajoute des espaces dans la chaine... (en fait je vois même pas pourquoi il y en aurait :D). la chaine sur laquelle tu fait les test tu l'obtiens comment ? si tu la rentre en dur dans ton programme tu met bien des '\\' et non des '\' tout seul hein ?
genre std::string path("c:\\test\\monFichier" );car si tu en met qu'un il prend le caractère d'échappement (si il existe sinon erreur...) genre \t te fait une tabulation... et donc pour avoir le caractère '\' il faut faire l'échappement du caractère d'échappement => d'où le '\\'
 
sinon... ben il y a toujours Boost avec le tokenizer :D
http://www.boost.org/libs/tokenizer/index.html
 
un ex :

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include<boost/tokenizer.hpp>
  4. int main()
  5. {
  6. std::string chaine("c:\\salut\\test" );
  7. boost::char_separator<char> sep("\\" );
  8. boost::tokenizer<boost::char_separator<char>> tokens(chaine, sep);
  9. std::cout << *(tokens.begin()) << "\n";
  10. return 0;
  11. }


 
bon là ça te donne que le premier mot... pour le dernier, tu incrémente l'itérateur ;)
 
(d'ailleurs au passage j'ai pas trouvé dans la doc pourquoi on avait pas le droit de faire tokens.end()-1 :/ ni même begin()+1... on peut juste l'incrémenter avec ++  si quelqu'un sait pourquoi je serai pas contre une explication :))

Reply

Marsh Posté le 15-01-2007 à 22:24:00    

bah bizarement je met des "\" tous seul et ça marche très bien...tant qu'il n'y a pas d'espaces! :D  
 
voyez par vous même:
 
ici ça marche
http://img234.imageshack.us/img234/5194/marchenn6.png
 
là ça marche plus
http://img162.imageshack.us/img162/1917/marchepasrx8.png
 
et voila le code:
 

Code :
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. int main()
  6. {
  7. string chemin, fichier;
  8. cout<<"\t\tTraitement des chemins d'acces"<<endl;
  9. cout<<endl;
  10. cout<<"Entrez un chemin d'acces fichier : "<<endl;
  11. cout<<endl;
  12. cin>>chemin;
  13. int x;
  14. x=chemin.find_last_of('\\', chemin.length())+1;
  15. fichier = chemin.substr(x, chemin.length()-x);
  16. cout<<endl;
  17. cout<<"Nom du fichier : "<<fichier<<endl;
  18. cout<<endl;
  19. }


Message édité par pedro001 le 15-01-2007 à 22:27:26
Reply

Marsh Posté le 15-01-2007 à 22:24:00   

Reply

Marsh Posté le 15-01-2007 à 23:11:36    

A propos du \, quand tu le saisis, il est automatiquement stocké comme \\ puisque ce n'est pas codé en dur.
Pour le problème d'espace, regarde du côté de cin.getline, tu devrais t'en sortir avec ça.

Reply

Marsh Posté le 16-01-2007 à 19:51:40    

En effet le problème vient surement de là...vu que l'espace agit comme un caractère délimiteur avec le cin ça pouvait pas marcher  :D  
 
par contre j'ai donc remplacé la ligne du cin par ça:
 

Code :
  1. cin.getline(chemin,sizeof(chemin));


 
et ça me met ça comme erreur je comprend pas:
 

Citation :

.\Projet chaine caractère.cpp(18) : error C2664: 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::getline(_Elem *,std::streamsize)' : impossible de convertir le paramètre 1 de 'std::string' en 'char *'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé

Reply

Marsh Posté le 16-01-2007 à 22:11:02    

pedro001 a écrit :

En effet le problème vient surement de là...vu que l'espace agit comme un caractère délimiteur avec le cin ça pouvait pas marcher  :D  
 
par contre j'ai donc remplacé la ligne du cin par ça:
 

Code :
  1. cin.getline(chemin,sizeof(chemin));


 
et ça me met ça comme erreur je comprend pas:
 

Citation :

.\Projet chaine caractère.cpp(18) : error C2664: 'std::basic_istream<_Elem,_Traits> &std::basic_istream<_Elem,_Traits>::getline(_Elem *,std::streamsize)' : impossible de convertir le paramètre 1 de 'std::string' en 'char *'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé



 
 
getline ecrit dans un tableau de char, pas dans une string.
Il faut l'utiliser comme ca:
 
string   chemin;
char     buffer[1000];
 
cin.getline(buffer, 1000);
chemin = string (buffer);

Reply

Marsh Posté le 16-01-2007 à 22:39:29    

c'est compliqué la prog quand on débute...mais ça marcheee!!!!!
 
Merci tout le monde de m'avoir aider!!
 
@++

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed