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

Copie d'un fichier dans un tableau a 2 entrées de string - C++ - Programmation

Marsh Posté le 22-01-2003 à 09:28:33    

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

Reply

Marsh Posté le 22-01-2003 à 09:28:33   

Reply

Marsh Posté le 22-01-2003 à 10:43:11    

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
Reply

Marsh Posté le 22-01-2003 à 12:44:56    

Merci v essayer :jap:

Reply

Marsh Posté le 22-01-2003 à 18:19:44    

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
Reply

Marsh Posté le 22-01-2003 à 18:32:10    

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
Reply

Marsh Posté le 23-01-2003 à 13:50:04    

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
Reply

Marsh Posté le 23-01-2003 à 16:16:14    

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
Reply

Marsh Posté le 23-01-2003 à 16:43:46    

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

Reply

Marsh Posté le 23-01-2003 à 16:47:32    

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

Reply

Marsh Posté le 23-01-2003 à 18:13:04    

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

Marsh Posté le 23-01-2003 à 18:13:04   

Reply

Marsh Posté le 23-01-2003 à 19:00:02    

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

Reply

Marsh Posté le 23-01-2003 à 23:01:38    

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

Marsh Posté le 23-01-2003 à 23:05:34    

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

Reply

Marsh Posté le 26-01-2003 à 10:45:38    

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

Marsh Posté le 26-01-2003 à 11:10:14    

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

Reply

Marsh Posté le 26-01-2003 à 21:34:30    

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

Marsh Posté le 26-01-2003 à 22:03:32    

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
Reply

Marsh Posté le 27-01-2003 à 03:14:42    

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
Reply

Marsh Posté le 27-01-2003 à 07:02:46    

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

Reply

Marsh Posté le 27-01-2003 à 07:55:20    

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
Reply

Sujets relatifs:

Leave a Replay

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