Isoler des nombres dans un fichier texte

Signaler
Messages postés
50
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
6 juin 2006
-
Messages postés
17
Date d'inscription
mardi 14 novembre 2000
Statut
Membre
Dernière intervention
21 novembre 2006
-
Salut
J'ai un (gros) probleme avec un fichier texte presente de la maniere suivante :

(1,3,1)
(2,3,5)
(2,5,10)
(2,1,10)
(2,4,4)
...

Il faut que je reussisse a isoler les 3 nombres de chaque ligne pour les mettre dans un tableau mais vu que ce n'est pas un fichier data, je ne vois absolument pas comment faire... Pour l'instant j'ai le code suivant :

// test lecture lookup file
# include
# include <fstream.h>

int main(){
char str [80];
ifstream infile ("lookup.txt", ios::in);

while(infile.getline (str, 80, '\n')){
// mettre les nombres dans le tableau...
//std::cout<<str<<std::endl;
};
infile.close();

system("pause");
return 0;
}

Si quelqun pouvais me filer un coup de main ca serait vraiment sympa.
PS: desole pour les accents mais je suis en Irlande en ce moment, donc clavier QWERTY ;)

11 réponses

Messages postés
198
Date d'inscription
lundi 2 juin 2003
Statut
Membre
Dernière intervention
15 février 2005

utilise fopen() et fgets() pour gérer ton fichier
Cmill
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
il faut que tu parcoures ta chaine str et tant que c'est un chiffre, l'isoler dans une variable et la convertir
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
ya encore plus simple avec les stringstream

#include 
#include <fstream>
#include <sstream>
#include <string>

using namespace std; 

void parse_line(const string& s, int tab[]) {

istringstream iss(s);
char c;

iss>>c>>tab[0]>>c>>tab[1]>>c>>tab[2];
}

int main()
{
string buff;
ifstream infile("gg.txt");
int tab[100][3], i=0;

while( infile >> buff )
{
parse_line(buff,tab[i]);
cout<<tab[i][0]<<'\t'<<tab[i][1]<<'\t'<<tab[i][2]<<'\n';
cin.get();
i++;
}

}
Messages postés
50
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
6 juin 2006

@djl
Je ne sait pas si ton code fonctionne etant donne qu'un nombre peut tenir sur deux caracteres, donc un 10 me donnerais 1 et 0 et pas 10... enfin je sais pas faudra que j'essaye. Mais c'est bon j'ai trouve la solution. Vla le code, ca pourra peut etre interesser qqun :

void fillLookupTab(){
ifstream infile (lkupfile, ios::in);
int a,b,c,meter(0),tmp(1);
char str [80];
if (infile) {
while(!infile.eof()){
if(infile.peek()=='(') infile.get();
infile >> a;
if(infile.peek()==',') infile.get();
infile >> b;
if(infile.peek()==',') infile.get();
infile >> c;
if(infile.peek()==')') infile.get();
infile.getline(str,80,'\n');
lookup[a-1][meter][0]=b;
lookup[a-1][meter][1]=c;
if(tmp==a) meter++;
else meter=0;
tmp=a;
}
infile.close();
}

Le seul probleme c'est que j'utilise le getline seulement pour changer de ligne... Donc si qqun sait comment passer une ligne en utilisant l'operateur >> ca serait plus beau...

merci qd meme pour vos conseils
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
'\n' ferme le buffer donc ya pas de pb avec >>

et mon code fonctionne tres bien, tu connais un peu les flux ?

int n=10;

cout<<n; tu crois que ca va afficher 1??
Messages postés
50
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
6 juin 2006

desole djil mais je ne suis pas un expert en C++ et je posais juste une question, je n'ai jamais dit que ton code ne marchait pas...
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
ok, scuz si g ete un peu sec,

g v t'expliquer

// on construit istringstream a partir de la chaine s
istringstream iss(s);
// c juste un char vu que les separateur sont des caracteres ',' ')' '(' ...
char c;

// tu te sert d'un istringstream comme cin, sauf que son buffer contient s, c'est a dire une ligne de ton fichier
iss>>c>>tab[0]>>c>>tab[1]>>c>>tab[2];
Messages postés
50
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
6 juin 2006

ok merci
Messages postés
17
Date d'inscription
mardi 14 novembre 2000
Statut
Membre
Dernière intervention
21 novembre 2006

es-ce-que les flux marchent avec des lignes du style :
0.55 4 0.0
12 1.456 0.45

sachant que les points sont pour des nombres a virgules ;) et essayer de les mettre directement dans une structure (ou une classe puisque C++)
struct coin{
float x;
float y;
float z;
}
...
infile>>coin;

es-ce-que ca peut le faire ?
Messages postés
17
Date d'inscription
mardi 14 novembre 2000
Statut
Membre
Dernière intervention
21 novembre 2006

mince, ca ne la pas mis sur plusieurs lignes ;)
Messages postés
17
Date d'inscription
mardi 14 novembre 2000
Statut
Membre
Dernière intervention
21 novembre 2006

mince, ca ne la pas mis sur plusieurs lignes ;)