Isoler des nombres dans un fichier texte

playmo420 Messages postés 50 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 6 juin 2006 - 8 avril 2004 à 10:55
cs_nicosh Messages postés 17 Date d'inscription mardi 14 novembre 2000 Statut Membre Dernière intervention 21 novembre 2006 - 1 juin 2005 à 16:13
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

c2millet Messages postés 198 Date d'inscription lundi 2 juin 2003 Statut Membre Dernière intervention 15 février 2005
8 avril 2004 à 11:02
utilise fopen() et fgets() pour gérer ton fichier
Cmill
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
8 avril 2004 à 12:08
il faut que tu parcoures ta chaine str et tant que c'est un chiffre, l'isoler dans une variable et la convertir
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
8 avril 2004 à 12:20
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++;
}

}
0
playmo420 Messages postés 50 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 6 juin 2006
8 avril 2004 à 12:29
@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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
8 avril 2004 à 12:35
'\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??
0
playmo420 Messages postés 50 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 6 juin 2006
8 avril 2004 à 12:56
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...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
8 avril 2004 à 13:08
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];
0
playmo420 Messages postés 50 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 6 juin 2006
8 avril 2004 à 13:58
ok merci
0
cs_nicosh Messages postés 17 Date d'inscription mardi 14 novembre 2000 Statut Membre Dernière intervention 21 novembre 2006
1 juin 2005 à 11:22
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 ?
0
cs_nicosh Messages postés 17 Date d'inscription mardi 14 novembre 2000 Statut Membre Dernière intervention 21 novembre 2006
1 juin 2005 à 11:23
mince, ca ne la pas mis sur plusieurs lignes ;)
0
cs_nicosh Messages postés 17 Date d'inscription mardi 14 novembre 2000 Statut Membre Dernière intervention 21 novembre 2006
1 juin 2005 à 16:13
mince, ca ne la pas mis sur plusieurs lignes ;)
0
Rejoignez-nous