 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
giovanni Guest
|
Posted: Sun May 14, 2006 9:23 pm Post subject: comment faire pour traiter le buffer |
|
|
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
|
Posted: Sun May 14, 2006 9:23 pm Post subject: Re: comment faire pour traiter le buffer |
|
|
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
|
Posted: Sun May 14, 2006 10:22 pm Post subject: Re: comment faire pour traiter le buffer |
|
|
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
|
Posted: Sun May 14, 2006 11:22 pm Post subject: Re: comment faire pour traiter le buffer |
|
|
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
|
Posted: Mon May 15, 2006 1:21 am Post subject: Re: comment faire pour traiter le buffer |
|
|
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
|
Posted: Tue May 16, 2006 4:24 am Post subject: Re: comment faire pour traiter le buffer |
|
|
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
|
Posted: Tue May 16, 2006 7:22 am Post subject: Re: comment faire pour traiter le buffer |
|
|
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 |
|
 |
|
|
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
|
|