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 

comment faire pour traiter le buffer

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





PostPosted: Sun May 14, 2006 9:23 pm    Post subject: comment faire pour traiter le buffer Reply with quote



comment faire pour traiter ce buffer ligne par ligne recuperer les donnée
ligne par ligne?#include <fstream>
#include <iostream>
#include <sstream>

int main()
{
// le constructeur de ifstream permet d'ouvrir un fichier en lecture
std::ifstream fichier( "fichier.txt" );

if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
{
std::stringstream buffer; // variable contenant l'intégralité du
fichier
// copier l'intégralité du fichier dans le buffer
buffer << fichier.rdbuf();
// nous n'avons plus besoin du fichier !
fichier.close();
// manipulations du buffer...
std::cout << "Taille du buffer : " << buffer.str().size() << '\n';
}
}
Back to top
Sylvain
Guest





PostPosted: Sun May 14, 2006 9:23 pm    Post subject: Re: comment faire pour traiter le buffer Reply with quote



giovanni wrote on 14/05/2006 22:05:
Quote:
comment faire pour traiter ce buffer ligne par ligne recuperer les donnée
ligne par ligne?

tu veux dire comment redécomposer ligne à ligne un énorme buffer composé
depuis un fichier qui était un ensemble de lignes (mais que l'on a ainsi
mis dans un gros buffer au risque de ne pouvoir le lire) ??

c'est une bonne question, mais je préfèrerais faire un traitement direct
via fgets, puis scanf si les lignes contiennent des données formattées
(ou directement fscanf).

Sylvain.
Back to top
giovanni
Guest





PostPosted: Sun May 14, 2006 10:22 pm    Post subject: Re: comment faire pour traiter le buffer Reply with quote



ah ok peu tu me faire un petit exemple?
"Sylvain" <noSpam (AT) mail (DOT) net> a écrit dans le message de news:
446792f0$0$21275$8fcfb975 (AT) news (DOT) wanadoo.fr...
Quote:
giovanni wrote on 14/05/2006 22:05:
comment faire pour traiter ce buffer ligne par ligne recuperer les donnée
ligne par ligne?

tu veux dire comment redécomposer ligne à ligne un énorme buffer composé
depuis un fichier qui était un ensemble de lignes (mais que l'on a ainsi
mis dans un gros buffer au risque de ne pouvoir le lire) ??

c'est une bonne question, mais je préfèrerais faire un traitement direct
via fgets, puis scanf si les lignes contiennent des données formattées (ou
directement fscanf).

Sylvain.
Back to top
Sylvain
Guest





PostPosted: Sun May 14, 2006 11:22 pm    Post subject: Re: comment faire pour traiter le buffer Reply with quote

giovanni wrote on 14/05/2006 23:28:
Quote:
ah ok peu tu me faire un petit exemple?

faire un exemple hors définition d'un besoin est simple mais je crains
non pertinant!

si j'imagine le fichier texte source suivant:

1 3.14 toto 3
2 6.28 tata 5
3 9.72 titi 12


alors le code suivant lira ces données

FILE* source = ::fopen("fichier.txt", "rt");
if (source){
char buffer[256];
while (::fgets(buffer, 256, source)){
int a, b;
double d;
char s[64];
if (sscanf(buffer, "%i\t%lg\t%s\t%i", &a, &d, s, &b) == 4){
// process read data
}
}
}
::fclose(source);

cette approche est pragmatique si vous n'avez à traiter que d'un fichier
simple, mais elle est aussi archaïque et manque de souplesse.

on souhaiterait plus qlq chose comme:

std::ifstream fichier( "fichier.txt" );
std::stringstream line;
int a, b;
std::string s;
double d;
while (fichier.getNextLine(line /*, eol_token */))
line >> a >> d >> s >> b;

mais je ne trouve aucun get line (basé sur un token EOL et non une
taille max) dans istream.

une solution pourrait être d'étendre ifstream pour lui ajouter cela, ie
un ifstream& operator>> (ifstream& ifs, istream& is); qui gérerait les
tokens usuels de fin de ligne (\r, \n, \r\n).

Sylvain.
Back to top
Loïc Joly
Guest





PostPosted: Mon May 15, 2006 1:21 am    Post subject: Re: comment faire pour traiter le buffer Reply with quote

Sylvain a écrit :
Quote:

std::ifstream fichier( "fichier.txt" );
std::stringstream line;
int a, b;
std::string s;
double d;
while (fichier.getNextLine(line /*, eol_token */))
line >> a >> d >> s >> b;

std::ifstream fichier( "fichier.txt" );
std::string s;
while (std::getline(fichier, string))
{
// Faire quelquechose avec s
}

--
Loïc
Back to top
giovanni
Guest





PostPosted: Tue May 16, 2006 4:24 am    Post subject: Re: comment faire pour traiter le buffer Reply with quote

ok mais ne sachant pas la taille du fichier ni le nombre de ligne comment
defnir buffer infini.... alieu de 256 ?
"Loïc Joly" <loic.actarus.joly (AT) numericable (DOT) fr> a écrit dans le message de
news: 4467cb39$0$166$a3f2974a (AT) nnrp1 (DOT) numericable.fr...
Quote:
Sylvain a écrit :

std::ifstream fichier( "fichier.txt" );
std::stringstream line;
int a, b;
std::string s;
double d;
while (fichier.getNextLine(line /*, eol_token */))
line >> a >> d >> s >> b;

std::ifstream fichier( "fichier.txt" );
std::string s;
while (std::getline(fichier, string))
{
// Faire quelquechose avec s
}

--
Loïc
Back to top
Loïc Joly
Guest





PostPosted: Tue May 16, 2006 7:22 am    Post subject: Re: comment faire pour traiter le buffer Reply with quote

giovanni a écrit :
Quote:
ok mais ne sachant pas la taille du fichier ni le nombre de ligne comment
defnir buffer infini.... alieu de 256 ?
"Loïc Joly" <loic.actarus.joly (AT) numericable (DOT) fr> a écrit dans le message de
news: 4467cb39$0$166$a3f2974a (AT) nnrp1 (DOT) numericable.fr...

Sylvain a écrit :

std::ifstream fichier( "fichier.txt" );
std::stringstream line;
int a, b;
std::string s;
double d;
while (fichier.getNextLine(line /*, eol_token */))
line >> a >> d >> s >> b;

std::ifstream fichier( "fichier.txt" );
std::string s;
while (std::getline(fichier, string))
{
// Faire quelquechose avec s
}

Où vois-tu un buffer ? Où vois tu 256 ? Mon code lit directement un
fichier, quel que soit sa taille, et le traite ligne par ligne.

--
Loïc
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.