Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1306 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Copie d'un fichier dans un tableau a 2 entrées de string

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Copie d'un fichier dans un tableau a 2 entrées de string

n°291572
exceptionn​alnain
Quel boulot de dingue hein ...
Posté le 22-01-2003 à 09:28:33  profilanswer
 

Voila g besoin de bufferiser un fichier texte, husqu'a maintenant je le faisais en C avec les problèmes de gestion de taille que l'on connait.  
Je voudrais savoir si l'on peut utiliser le type string du C++ pour se faciliter la vie de ce point de vue.
 
Merci

mood
Publicité
Posté le 22-01-2003 à 09:28:33  profilanswer
 

n°291665
LetoII
Le dormeur doit se réveiller
Posté le 22-01-2003 à 10:43:11  profilanswer
 

Ben oui, un stockage par ligne est bien sympa par exemple:
 

Code :
  1. #include <fstream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;
  5. typedef vector<string> FichierText;
  6. int main(int,char**)
  7. {
  8.    ifstream fichier("monFichier" );
  9.    string ligne;
  10.    FichierText text;
  11.    getline(fichier,ligne);
  12.    text.push_back(ligne);
  13.    while(!fichier.eof())
  14.     {
  15.         getline(fichier,ligne);
  16.         text.push_back(ligne);
  17.     }
  18.  
  19.    //Autre chose
  20.    return 0;
  21. }


Message édité par LetoII le 22-01-2003 à 10:43:35

---------------
Le Tyran
n°291771
exceptionn​alnain
Quel boulot de dingue hein ...
Posté le 22-01-2003 à 12:44:56  profilanswer
 

Merci v essayer :jap:

n°292072
exceptionn​alnain
Quel boulot de dingue hein ...
Posté le 22-01-2003 à 18:19:44  profilanswer
 

Code :
  1. #include <fstream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;  //ca sert à koi ??
  5. typedef vector<string> FichierText;
  6. int main(int, char**) //C koi ces paramètres à passer ?
  7. {
  8.    ifstream fichier("monFichier" );  //on ouvre le fichier ?
  9.    string ligne;
  10.    FichierText text;             //???
  11.    getline(fichier,ligne);
  12.    text.push_back(ligne); //sert à koi ?
  13.    while(!fichier.eof())
  14.     {
  15.         getline(fichier,ligne);
  16.         text.push_back(ligne);
  17.     }
  18.    // le reste ca va ^^
  19.    //Autre chose  
  20.    return 0;
  21. }


 
 
Tu peux m'expliker stp ?


Message édité par exceptionnalnain le 22-01-2003 à 18:20:12
n°292082
LetoII
Le dormeur doit se réveiller
Posté le 22-01-2003 à 18:32:10  profilanswer
 

Code :
  1. #include <fstream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;  //Déclaration du namespace std comme namespace par défaut
  5. typedef vector<string> FichierText;
  6. int main(int, char**) //Les paramétres sont ceux de la ignes de commande
  7. {
  8.    ifstream fichier("monFichier" );  //Ouverture du fichier
  9.    string ligne;
  10.    FichierText text;             //Déclaration d'un tableau de cha^ne (voir le typedef)
  11.    getline(fichier,ligne);
  12.    text.push_back(ligne); //Ajout de la ligne lu à la fin du tableau
  13.    while(!fichier.eof())
  14.     {
  15.         getline(fichier,ligne);
  16.         text.push_back(ligne);
  17.     }
  18.    // le reste ca va ^^
  19.    //Autre chose  
  20.    return 0;
  21. }


Message édité par LetoII le 22-01-2003 à 18:32:38

---------------
Le Tyran
n°292512
exceptionn​alnain
Quel boulot de dingue hein ...
Posté le 23-01-2003 à 13:50:04  profilanswer
 

Barf g po vu vector ni namespace encore, tant pis, v continuer a l'ancienne, mais merci pour tout je garde ca kan meme !


Message édité par exceptionnalnain le 23-01-2003 à 15:06:43
n°292637
HelloWorld
Salut tout le monde!
Posté le 23-01-2003 à 16:16:14  profilanswer
 

faut pas !
c'est tout bete !
vector = tableau
vector<string> = tableau de string
ca s'utilise comme un tableau normal
a part que tu peux ajouter facilement un element sans te soucier de l'allocation etc ... avec push_back.
Y'a plein d'autres choses disponibles (tableau.size() pour sa taille, ...)
le namespace, il le faut c'est tout.
ca te permet de pourvoir utiliser string et vector sans devoir taper std:: devant :
sans using namespace std;  
    std::string ... std::vector
avec using namespace std;  
    string ... vector
 
Baisse pas les bras, le temps que tu vas passer a maitriser vector et string sera vite amorti par la suite !


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°292671
Taz
bisounours-codeur
Posté le 23-01-2003 à 16:43:46  profilanswer
 

En C++ (ou en C) on ne teste jamais eof comme ça (comme en Pascal) pour la simple bonne raison que EOF ne survient qu'apres une lecture infructueuse et pas quand on est positionné en fin de fichier.
 
la bonne ecriture est donc
 

Code :
  1. while(getline(fichier, ligne))
  2. {
  3.    vecteur.push_back(ligne);
  4. }


 
la boucle va breaker en cas de EOF ou de problème d'E/S. on peut alors vérifier ce qu'il s'est passé en testant eof(), bad() ou fail()
 
 
 

n°292678
Taz
bisounours-codeur
Posté le 23-01-2003 à 16:47:32  profilanswer
 

exceptionnalnain a écrit :

Barf g po vu vector ni namespace encore, tant pis, v continuer a l'ancienne, mais merci pour tout je garde ca kan meme !

quel interet de faire du C++ plutot que du C alors? il me semble que le code <corrigé> qui t'es proposé est tres claire, sure tout en étant tres performant

n°292751
exceptionn​alnain
Quel boulot de dingue hein ...
Posté le 23-01-2003 à 18:13:04  profilanswer
 

++Taz a écrit :

quel interet de faire du C++ plutot que du C alors? il me semble que le code <corrigé> qui t'es proposé est tres claire, sure tout en étant tres performant


 
komment tu veux ke je te répondes, si je ne sais pas ce ke C ??
 
cela dit merci :jap:


Message édité par exceptionnalnain le 23-01-2003 à 18:13:24
mood
Publicité
Posté le 23-01-2003 à 18:13:04  profilanswer
 

n°292800
Taz
bisounours-codeur
Posté le 23-01-2003 à 19:00:02  profilanswer
 

exceptionnalnain a écrit :

Voila g besoin de bufferiser un fichier texte, husqu'a maintenant je le faisais en C avec les problèmes de gestion de taille que l'on connait.  
Je voudrais savoir si l'on peut utiliser le type string du C++ pour se faciliter la vie de ce point de vue.
 
Merci

tu tu dis n'improt koi alors...

n°292925
LetoII
Le dormeur doit se réveiller
Posté le 23-01-2003 à 23:01:38  profilanswer
 

++Taz a écrit :

En C++ (ou en C) on ne teste jamais eof comme ça (comme en Pascal) pour la simple bonne raison que EOF ne survient qu'apres une lecture infructueuse et pas quand on est positionné en fin de fichier.
 
la bonne ecriture est donc
 

Code :
  1. while(getline(fichier, ligne))
  2. {
  3.    vecteur.push_back(ligne);
  4. }


 
la boucle va breaker en cas de EOF ou de problème d'E/S. on peut alors vérifier ce qu'il s'est passé en testant eof(), bad() ou fail()
 
 
 
 


 
 :non: Si tu remarque bien je fais une lecture avant le début de ma boucle justement pour prendre en compte se pb, le seule truc c que j'aurais pas du faire de push en dehors dans la boucle, mais le mettre en première instruction de celle ci.


---------------
Le Tyran
n°292929
Taz
bisounours-codeur
Posté le 23-01-2003 à 23:05:34  profilanswer
 

ben tu te trompes: tu mets le bloc d'instruction avant la boucle pour simuler un do-while... mais il n'en est rien
 
et tu n'as pas lu mon post.
 
avec ton code:
 

Code :
  1. while(!fichier.eof())
  2.    {
  3.        getline(fichier,ligne); // la fin de fichier peut etre détectée ici
  4.        text.push_back(ligne); // alors la ligne ajoutée est invalide (ca sera en fait la derniere ligne précédement lue
  5.    }


 
relis mon post et fait moi confiance

n°294218
LetoII
Le dormeur doit se réveiller
Posté le 26-01-2003 à 10:45:38  profilanswer
 

++Taz a écrit :

ben tu te trompes: tu mets le bloc d'instruction avant la boucle pour simuler un do-while... mais il n'en est rien
 
et tu n'as pas lu mon post.
 
avec ton code:
 

Code :
  1. while(!fichier.eof())
  2.    {
  3.        getline(fichier,ligne); // la fin de fichier peut etre détectée ici
  4.        text.push_back(ligne); // alors la ligne ajoutée est invalide (ca sera en fait la derniere ligne précédement lue
  5.    }


 
relis mon post et fait moi confiance
 


 
Je ne me trompe pas, je me suis juste mal exprimé, voilà ce que j'aurais du mettre comme code:

Code :
  1. #include <fstream>
  2.   #include <string>
  3.   #include <vector>
  4.  
  5.   using namespace std;
  6.   typedef vector<string> FichierText;
  7.  
  8.   int main(int,char**)
  9.   {
  10.        ifstream fichier("monFichier" );
  11.        string ligne;
  12.        FichierText text;
  13.    
  14.        getline(fichier,ligne);
  15.    
  16.          
  17.        while(!fichier.eof())
  18.         {
  19.                    
  20.               text.push_back(ligne);
  21.               getline(fichier,ligne);
  22.         }
  23.        
  24.        //Autre chose
  25.    
  26.        return 0;
  27.   }


 
Et si on veut blinder la chose on peut même vérifier qu'aucun octé n'a été lu lors du getline.


Message édité par LetoII le 26-01-2003 à 10:47:46

---------------
Le Tyran
n°294227
Taz
bisounours-codeur
Posté le 26-01-2003 à 11:10:14  profilanswer
 

ce qui ne fonctionne toujours aps si l'erreur est autre que eof (et ça arrive). et en plus ton code est moins concis... t'entete pas

n°294503
LetoII
Le dormeur doit se réveiller
Posté le 26-01-2003 à 21:34:30  profilanswer
 

++Taz a écrit :

ce qui ne fonctionne toujours aps si l'erreur est autre que eof (et ça arrive). et en plus ton code est moins concis... t'entete pas


Je me demande qui s'entête par ce que ça c la forme clasique pour ce genre de traitement... enfin bon


---------------
Le Tyran
n°294519
Taz
bisounours-codeur
Posté le 26-01-2003 à 22:03:32  profilanswer
 

c'est peut etre la forme classique en pascal, mais pas en C++, ni en C d'ailleurs.
 
la fonction membre eof ne sert pas à détecter l'erreur mais à la qualifier. sinon, on ne se serait pas donné le mal de faire des fonctions avec des codes d'erreurs. je suis désolé pour toi :D mais c'est comme ça. le comportement que tu utilises peut etre un bug grave en cas d'erreur d'E/S autre que eof (et ça arrive plus que tu ne semble le croire).
 
allez fais-moi plaisir! en plus la méthode usuelle en C++ est aussi plus concise. je ne vois vraiment pas de raisons pour ne pas l'employer.
 
 
edit: au fait, n'oublies pas de fermer tes fichiers ouverts.


Message édité par Taz le 26-01-2003 à 22:06:01
n°294576
Musaran
Cerveaulté
Posté le 27-01-2003 à 03:14:42  profilanswer
 

Un bon principe de programamtion est qu'on ne devrait pas spécifier deux fois la même chose.
Or, le getline(fichier,ligne); est en double dans ton exemple LetoII, c'est une opportunité de bogue en cas de mise à jour.
 
Si c'est le fait de mettre une expression complexe en test qui te gêne:

Code :
  1. for(;;){
  2. getline(fichier, ligne);
  3. if(!is.fail()) //ou !is en raccourçi
  4.  break;
  5. vecteur.push_back(ligne);
  6. }


Message édité par Musaran le 27-01-2003 à 03:15:52

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°294587
Taz
bisounours-codeur
Posté le 27-01-2003 à 07:02:46  profilanswer
 

merci musaran. ton code est strictement équivalent au mien. en effet getline renvoie un istream&, qui peut donc etre évalué (et dispose de operator!)
donc pas de problème.  :jap:  
 
moi j'aurais vu la chose de façon plus optimiste: if(is.good())  :D

n°294594
LetoII
Le dormeur doit se réveiller
Posté le 27-01-2003 à 07:55:20  profilanswer
 

Bon si vous vous y métez à deux contre moi je me rend :D
On va pas se foutre sur la gueule pour bou de code c ridicule. Soit dit en passant je trouve le break relativement dégueux, mais bon, chacun est libre de faire ce qu'il veut.
Pour en revenir àa ce que disait ++Taz, je ne vois pas pkoi tu me parle de détection d'erreur, tout ce qui m'interresse dans ce bout de code c de détecter la fin du flux (d'où le eof). Je reconnais volontier qu'il n'y a pas de gestion d'erreur dans ce code et ct pas franchement le but que je visais. Enfin pour conclur, effectivement ton code marche et me plait bien, la prochaine fois que j'ai besoin d'utiliser les flux du C++ j'y penserai :D


Message édité par LetoII le 27-01-2003 à 08:04:57

---------------
Le Tyran

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Copie d'un fichier dans un tableau a 2 entrées de string

 

Sujets relatifs
Décompiler une fichier exe ?comment inclure une classe d'un fichier JAR
[PHP] Gerer les news --> SQL ou fichier simple[Servlet] download de fichier
[HTML] appeler un fichier dans un tableau?Fichier vcl60 dans le bureau
[PHP] Récuperer le texte d'un fichier sur un autre serveurLargeur des colonnes d'un tableau
constructeur de copie de base 
Plus de sujets relatifs à : Copie d'un fichier dans un tableau a 2 entrées de string


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR