C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

ifstream : pb avec seekg, début de fichier

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
KooK
Guest





PostPosted: Mon Feb 13, 2006 1:06 pm    Post subject: ifstream : pb avec seekg, début de fichier Reply with quote



Salut,

Mon problème était qu'après avoir lu un fichier avec un "while(getline(...))",
la commande "seekg(0,ios::beg)" ne fonctionnait pas.

Après une recherche dans le groupe, j'ai résolu mon pb en mettant un
"fe.clear()" avant le seekg. Maintenant j'aimerai comprendre ce qui se passe.

-------------------------------
voilà mon code :
#include <fstream>
#include <iostream>

using namespace std;

void lire_fichier(ifstream &fe)
{
string ptr;
while(getline(fe,ptr))
cout << ptr << endl;
}

int main (int argc, char** argv)
{
ifstream fe("test.cpp");

if(!fe)
{
cerr << "fichier non ouvert\n";
exit(1);
}

fe.seekg(0, std::ios_base::end); //ca marche
cout << "1e passe : " << endl;
lire_fichier(fe);
//on revient au début du fichier
fe.clear();
fe.seekg(0, std::ios_base::beg); //<-- marche si clear()
// fe.seekg(0, std::ios::beg); //<-- marche pas non plus
cout << "2e passe : " << endl;
lire_fichier(fe);
}

Résultats :
1e passe :
2e passe :

---------------
J'ai ajouté :
fe.exceptions(ios::failbit, ios::badbit);
juste avant le premier seekg.

Voilà ce que j'obtiens :
1e passe :
terminate called after throwing an instance of 'std::ios_base::failure'
what() : basic_ios::clear
Aborted

Est-ce que la lecture de fin de fichier provoque une erreur ?
Comment lire plusieurs fois une même fichier proprement ?
des explications, liens sont les bienvenus.

KooK
Back to top
kanze
Guest





PostPosted: Mon Feb 13, 2006 7:06 pm    Post subject: Re: ifstream : pb avec seekg, début de fichier Reply with quote



KooK wrote:

Quote:
Mon problème était qu'après avoir lu un fichier avec un
"while(getline(...))", la commande "seekg(0,ios::beg)" ne
fonctionnait pas.

Après une recherche dans le groupe, j'ai résolu mon pb en
mettant un "fe.clear()" avant le seekg. Maintenant j'aimerai
comprendre ce qui se passe.

-------------------------------
voilà mon code :
#include <fstream
#include <iostream

#include <string>
aussi.

Quote:
using namespace std;

void lire_fichier(ifstream &fe)
{
string ptr;
while(getline(fe,ptr))
cout << ptr << endl;
}

int main (int argc, char** argv)
{
ifstream fe("test.cpp");

if(!fe)
{
cerr << "fichier non ouvert\n";
exit(1);
}

fe.seekg(0, std::ios_base::end); //ca marche

C'est normal, on n'a rien encore fait.

Quote:
cout << "1e passe : " << endl;
lire_fichier(fe);

En sortie, on aurait normalement le eofbit et le failbit de
positionné. L'un ou l'autre fait que toute opération qui suit
échoue.

Quote:
//on revient au début du fichier
fe.clear();
fe.seekg(0, std::ios_base::beg); //<-- marche si clear()
// fe.seekg(0, std::ios::beg); //<-- marche pas non plus

Comment, ça ne marche pas ? Ça doit appeler exactement la même
fonciton avec exactement les mêmes paramètres.

Quote:
cout << "2e passe : " << endl;
lire_fichier(fe);
}

Résultats :
1e passe :
2e passe :

Et qu'est-ce qu'il y avait dans le fichier ? Je me serais
attendu à le voir dans la deuxième passe.

Quote:
---------------
J'ai ajouté :
fe.exceptions(ios::failbit, ios::badbit);
juste avant le premier seekg.

Voilà ce que j'obtiens :
1e passe :
terminate called after throwing an instance of 'std::ios_base::failure'
what() : basic_ios::clear
Aborted

Est-ce que la lecture de fin de fichier provoque une erreur ?

C'est comme ça, effectivement, qu'on reconnaît être arrivé à la
fin en C++. On essaie de lire, et il n'y a rien de plus à lire.

Quote:
Comment lire plusieurs fois une même fichier proprement ?

Le plus proprement, ça serait de le réouvrir chaque fois, avec
un nouveau ifstream. Sinon, clear() et le seekg() doit faire
l'affaire.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
KooK
Guest





PostPosted: Tue Feb 14, 2006 9:06 am    Post subject: Re: ifstream : pb avec seekg, début de fich ier Reply with quote



kanze a écrit :
Quote:
KooK wrote:

fe.seekg(0, std::ios_base::end); //ca marche

C'est normal, on n'a rien encore fait.
Ce que je voulais dire, c'est que ça place bien le pointeur en fin de

fichier.
Quote:
cout << "1e passe : " << endl;
lire_fichier(fe);

En sortie, on aurait normalement le eofbit et le failbit de
positionné. L'un ou l'autre fait que toute opération qui suit
échoue.

//on revient au début du fichier
fe.clear();
fe.seekg(0, std::ios_base::beg); //<-- marche si clear()
// fe.seekg(0, std::ios::beg); //<-- marche pas non plus

Comment, ça ne marche pas ? Ça doit appeler exactement la même
fonciton avec exactement les mêmes paramètres.
Oui, c'est la même chose, ça ne marche qu'avec le 'clear()', désolé un

reste de commentaire obsolète.

Quote:
cout << "2e passe : " << endl;
lire_fichier(fe);
}

Résultats :
1e passe :
2e passe :

Et qu'est-ce qu'il y avait dans le fichier ? Je me serais
attendu à le voir dans la deuxième passe.
Re-désolé, c'est le résultat d'avant l'introduction du clear().

Le fichier s'affiche en 2e passe (il s'agit en fait du fichier source).
Quote:
---------------
J'ai ajouté :
fe.exceptions(ios::failbit, ios::badbit);
juste avant le premier seekg.

Voilà ce que j'obtiens :
1e passe :
terminate called after throwing an instance of 'std::ios_base::failure'
what() : basic_ios::clear
Aborted

Est-ce que la lecture de fin de fichier provoque une erreur ?

C'est comme ça, effectivement, qu'on reconnaît être arrivé à la
fin en C++. On essaie de lire, et il n'y a rien de plus à lire.

Comment lire plusieurs fois une même fichier proprement ?

Le plus proprement, ça serait de le réouvrir chaque fois, avec
un nouveau ifstream. Sinon, clear() et le seekg() doit faire
l'affaire.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Merci d'avoir pris le temps de répondre.

KooK
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.