Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

comment faire pour traiter le buffer

6 réponses
Avatar
giovanni
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';
}
}

6 réponses

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

Avatar
giovanni
ah ok peu tu me faire un petit exemple?
"Sylvain" a écrit dans le message de news:
446792f0$0$21275$
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.



Avatar
Sylvain
giovanni wrote on 14/05/2006 23:28:
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, "%it%lgt%st%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, rn).

Sylvain.

Avatar
Loïc Joly

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

Avatar
giovanni
ok mais ne sachant pas la taille du fichier ni le nombre de ligne comment
defnir buffer infini.... alieu de 256 ?
"Loïc Joly" a écrit dans le message de
news: 4467cb39$0$166$

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



Avatar
Loïc Joly
ok mais ne sachant pas la taille du fichier ni le nombre de ligne comment
defnir buffer infini.... alieu de 256 ?
"Loïc Joly" a écrit dans le message de
news: 4467cb39$0$166$


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