help ! seekg et ifstream , ça marche pas !

help ! seekg et ifstream , ça marche pas ! - C++ - Programmation

Marsh Posté le 07-04-2004 à 19:30:04    

Bonjour,  
 
j'ai le programme suivant : (c dans une fonction, et name est un paramètre)
 

Code :
  1. string s;
  2.   ifstream f(name.c_str());
  3.  
  4.   while (!f.eof())
  5.   {
  6.       f >>s;
  7.   }
  8.   f.seekg( 0, ios::beg ); // on se remet au début   
  9.   if (f.eof()) cout << "test à la con eof"<<endl;;
  10.  
  11.   f.close();


 
et il m'affiche bien le test à la con ...
ce qui veut dire qu'il ne revient pas au début !!!
est ce que quelqu'un veut bien me dire pourquoi
 
 
PS: Taz va me dire pas besoin de fermer le fichier,mais j'aimerai bien savoir pourquoi ... accessoirement ...


Message édité par fucky_fuck le 07-04-2004 à 19:35:26
Reply

Marsh Posté le 07-04-2004 à 19:30:04   

Reply

Marsh Posté le 07-04-2004 à 19:51:38    

je vais surtout te dire que c'est complètement pourri
 
 
  while(f >> s)
    {
      // noop
    }  
 
 
je recommence pas mes explications sur eof
 
pourquoi pas de close ? destructeur, ça te dit quelque chose ?
 
je recolle encore une fois

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. using namespace std;
  5. int main(int argc, char **argv)
  6. {
  7.   ifstream ifs;
  8.   istream *isp=0;
  9.   if(argc!=2)
  10.     {
  11.       cout << "Utilisation de « cin »\n";
  12.       isp=&cin;
  13.     }
  14.   else
  15.     {
  16.       cout << "Utilisation de  " << argv[1] << " \n";
  17.       ifs.open(argv[1]);
  18.       isp=&ifs;
  19.     }
  20.   istream &is(*isp);
  21.  
  22.   if(!is)
  23.     {
  24.       cout << "Impossible d\'ouvrir le flux\n";
  25.       return 1;
  26.     }
  27.   string s;
  28.   cout << "Lecture\n";
  29.   while(getline(is, s))
  30.     {
  31.       cout << s << '\n';
  32.     }
  33.   is.clear();
  34.   if(is.seekg(0, ifstream::beg))
  35.     {
  36.       cout << "Relecture\n";
  37.       while(getline(is, s))
  38. {
  39.   cout << s << '\n';
  40. }
  41.     }
  42.   else
  43.     {
  44.       cout <<  "Ce n'est pas un flux positionnable\n";
  45.     }
  46. }

Reply

Marsh Posté le 07-04-2004 à 19:57:58    

ouais evidemment j'aurai du penser au destructeur !
 
 
merci pour l'explication ! j'avais fait une recherche, mais apparemment j'avais mal cherché ! Merci ô grand maitre !
 
PS : sinon le while, j'ai autre chose dedans, ct juste pour faire court pour le post, normalement je lit des int, des float et des string..

Reply

Marsh Posté le 07-04-2004 à 20:09:54    

bon ben je vois que t'as pas compris, et que je dois encore un fois recommencé ...
 
 
comment c'est foutu un stream ? ben dedans t'as sans doute un descripteur de fichier, un buffer et des drapeaux qui marquent l'état du flux (valide, erreur, fin_de_fichier)
 
et justement, c'est drapeaux, pour connaitre leur valeur (ou la modifier), on a tout un tas de fonctions dont fait partie feof : eof te renvoie true si le flag eof est positionné.
 
feof ne détectera __jamais__ la fin de fichier.
 
while(!f.eof()) ne fonctionnera __jamais__ en effet, le drapeau sera positionné à la première levée à cause d'une tentative de lecture alors que le pointeur de fichier est en bon de course. et non pas, eof sera positionné dès que la fin de fichier est atteinte (i.e après avoir lu le dernier enregistrement du fichier)
 
maintemant
 
while(f >> o) s'interrompt des qu'un drapeau d'erreur est positionné.
 
à toi de savoir si c'est eof en le testant ensuite.
 
si tu veux retravailler le flux, il faut remettre les drapeaux à zéro avec clear()


Message édité par Taz le 07-04-2004 à 20:10:08
Reply

Marsh Posté le 07-04-2004 à 22:54:44    

ok c compris cette fois !
 
désolé de t'avoir fait répéter...

Reply

Sujets relatifs:

Leave a Replay

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