Besoin d'aide en c+
nikolai
-
speed22 Messages postés 35 Statut Membre -
speed22 Messages postés 35 Statut Membre -
Bonjour,
j'essaie d'écrire un programme qui extrait des nombres décimaux d'un fichier txt pour les mettre dans un tableau.
le fichier txt se présente comme suit :
455.454;87.56;654.78;
456.87;12.56;89.364;
etc...
sur chaque ligne se trouvent la coord en x, y et z ; que je veux placer dasn trois tableaux differents ( ici coord1, coord1, coord3).
mon problème c que le programme me renvoie des zéros au lieu de mes valeurs...
si vous avez une idée du pourquoi, n'hésitez pas!
j'essaie d'écrire un programme qui extrait des nombres décimaux d'un fichier txt pour les mettre dans un tableau.
le fichier txt se présente comme suit :
455.454;87.56;654.78;
456.87;12.56;89.364;
etc...
sur chaque ligne se trouvent la coord en x, y et z ; que je veux placer dasn trois tableaux differents ( ici coord1, coord1, coord3).
mon problème c que le programme me renvoie des zéros au lieu de mes valeurs...
si vous avez une idée du pourquoi, n'hésitez pas!
#include "stdafx.h"
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
string line;
ifstream myfile ("test.txt");
vector<double> coord1;
vector<double> coord2;
vector<double> coord3;
if (myfile.is_open())
{
int i = 0;
while (! myfile.eof() )
{
getline (myfile,line);
stringstream ss(line);
coord1.resize(i+1);
coord2.resize(i+1);
coord3.resize(i+1);
double nombre1;
double nombre2;
double nombre3;
char sep;
while(ss >> nombre1 >> sep >> nombre2 >> sep >> nombre3 >> sep)
{
coord1[i]=nombre1;
coord2[i]=nombre2;
coord3[i]=nombre3;
}
cout << coord2[i] << endl;
i = i+1;
}
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
19 réponses
Le "." qui sépare les nombres est génant étant donner que tu utilise des variables de type entier/double
La partie qui traite une ligne ne semble pas poser de probleme. je l'ai testée sur une ligne seule et elle marche. il faut surement regarder du côté de la boucle qui passe de ligne en ligne non?
cout << coord2[i] << endl;
pourquoi ne pas le mettre dans ton second while ?
car la a l'heure actuelle tu lis la dernière case de ton tableau coord2 lorsque tu sort de ton while donc tu peut éventuellement avoir 0 comme résultat
Test et tiens moi au courant
Je vais réfléchir aux autres options d'erreurs, je compilerait ca chez moi ce soir pour voir ce qui ne va pas, je te tiens au courant si j'ai d'autres idées
pourquoi ne pas le mettre dans ton second while ?
car la a l'heure actuelle tu lis la dernière case de ton tableau coord2 lorsque tu sort de ton while donc tu peut éventuellement avoir 0 comme résultat
Test et tiens moi au courant
Je vais réfléchir aux autres options d'erreurs, je compilerait ca chez moi ce soir pour voir ce qui ne va pas, je te tiens au courant si j'ai d'autres idées
tu souleves un point qui me parait bizarre, c'est que quand je mets le cout<<(etc...) dans le second while, le programme ne me renvoie rien ...(?!). je sais pas si c pas ma gestion de lindice i qui pose problème ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
On va reprendre ton code
#include "stdafx.h"
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <fstream>
using namespace std;
// Tout ce qui a précédemment c'est bon y'a pas de probleme
int main ()
{
string line;
ifstream myfile ("test.txt");
vector<double> coord1;
vector<double> coord2;
vector<double> coord3;
// On a déclarer les variables précédemment
if (myfile.is_open())
{
int i = 0; // On a "i" a 0
while (! myfile.eof() )
{
getline (myfile,line); // On concatène les lignes
stringstream ss(line);
/********************************************************
coord1.resize(i+1); // On redimensionne les vecteurs
coord2.resize(i+1);
coord3.resize(i+1);
********************************************************/
Tu peut m'expliquer ce que font ces lignes et a combien se retrouve "i" après qu'elles aient été effectuée ? j'utilise très rarement resize() pour ne pas dire jamais :)
On regarde la suite du code après cette explication qu'on se plante pas sur le calcul de i ;)
#include "stdafx.h"
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <fstream>
using namespace std;
// Tout ce qui a précédemment c'est bon y'a pas de probleme
int main ()
{
string line;
ifstream myfile ("test.txt");
vector<double> coord1;
vector<double> coord2;
vector<double> coord3;
// On a déclarer les variables précédemment
if (myfile.is_open())
{
int i = 0; // On a "i" a 0
while (! myfile.eof() )
{
getline (myfile,line); // On concatène les lignes
stringstream ss(line);
/********************************************************
coord1.resize(i+1); // On redimensionne les vecteurs
coord2.resize(i+1);
coord3.resize(i+1);
********************************************************/
Tu peut m'expliquer ce que font ces lignes et a combien se retrouve "i" après qu'elles aient été effectuée ? j'utilise très rarement resize() pour ne pas dire jamais :)
On regarde la suite du code après cette explication qu'on se plante pas sur le calcul de i ;)
en fait c'est bon, je m'étais trompé dans la syntaxe de mon fichier .txt : il n'y avait pas le ";" à la fin d'une ligne ce qui faussait tout.
sinon juste pour info :
mes tableaux de départ sont de taille 0. mon i de départ vaut 0. donc à la premiere boucle mon tableau doit etre de taille i+1 =1 pour pouvoir y mettre "nombre1". c'est à ca que sert le resize.
merci beaucoup en tout cas pour ton aide. ça m'a fait gambergé sur le fichier .txt lui même :) comme quoi l'erreur peut venir de nimporte ou....
ciao
sinon juste pour info :
mes tableaux de départ sont de taille 0. mon i de départ vaut 0. donc à la premiere boucle mon tableau doit etre de taille i+1 =1 pour pouvoir y mettre "nombre1". c'est à ca que sert le resize.
merci beaucoup en tout cas pour ton aide. ça m'a fait gambergé sur le fichier .txt lui même :) comme quoi l'erreur peut venir de nimporte ou....
ciao
Merci pour l'info pour le resize sa me remet dans le bain ^^
J'ai pas fait grand chose mais content d'y avoir contribuer
Bonne journée bon courage
J'ai pas fait grand chose mais content d'y avoir contribuer
Bonne journée bon courage
ah! il me reste juste un ptit probleme c que le programme ne veut afficher que 6 chiffres significatifs. après il arrondi et met une puissance de 10.
il y a moyen de lui demander d'afficher plus de chiffres?
il y a moyen de lui demander d'afficher plus de chiffres?
Il arrondi et met une puissance de 10 ? tu peut me donner un exemple pour mieux comprendre stp ?
6 chiffres significatifs ne sont pas suffisants ? :p ^^
6 chiffres significatifs ne sont pas suffisants ? :p ^^
et bien en fait les données proviennent d'un relevé topologique de terrain.
une ligne classique c'est :
584848.847,1827830.057,803.238 :-)
moi j'ai testé d'abord avec deux lignes (le fichier precedent fait 2776 lignes...):
5454545445.456,1,2
1.456,2.1,345.45566
ça marche bien.
mais en examinant ce que me renvoie le programme après que je l'ai fait fonctionné sur mon fichier de 2776 lignes j'ai vu qu'il faisait un peu n'importe quoi en fait.
j'ai vérifié il parcourt bien les 2776 lignes ( j'ai mis " cout << i << endl " )
il renvoie n'importe quoi
exemple:
les 2 premières lignes de mon fichier .txt sont
584848.847,1827830.057,803.238
584858.847,1827840.057,803.766
et le programme renvoie
585469 1,82786e+006 796.515
585469 1,82785e+006 797.049
pas vraiment fiable quoi ^^
une ligne classique c'est :
584848.847,1827830.057,803.238 :-)
moi j'ai testé d'abord avec deux lignes (le fichier precedent fait 2776 lignes...):
5454545445.456,1,2
1.456,2.1,345.45566
ça marche bien.
mais en examinant ce que me renvoie le programme après que je l'ai fait fonctionné sur mon fichier de 2776 lignes j'ai vu qu'il faisait un peu n'importe quoi en fait.
j'ai vérifié il parcourt bien les 2776 lignes ( j'ai mis " cout << i << endl " )
il renvoie n'importe quoi
exemple:
les 2 premières lignes de mon fichier .txt sont
584848.847,1827830.057,803.238
584858.847,1827840.057,803.766
et le programme renvoie
585469 1,82786e+006 796.515
585469 1,82785e+006 797.049
pas vraiment fiable quoi ^^
j'ai essayé de ne garder que 3 lignes sur les 2776 et là le programme renvoie les bonnes valeurs...
bizarre non?
bizarre non?
Déjà tu est sur que c'est bien les lignes finales qui correspondent a celle de départ ? y'a pas encore une erreur dans le i ? parce que qu'il te mette une puissance certe mais en ne prenant que les 6 premiers char :
584848 = 585469
584858 = 585469
tu est sur il lis pas quelques lignes plus loin ?
584848 = 585469
584858 = 585469
tu est sur il lis pas quelques lignes plus loin ?
certain. d'ailleurs pour la 3ème colonne il ne renvoie aucune valeur supérieur à 810 alors qu'il y en a beaucoup!
Bon bah je continuerait de t'aider ce soir a partir de 18h car la, il faut que je compile pour mieux comprendre ^^
désolé, a tout a l'heure, jvais y réfléchir tout de même d'ici la et te préviens si j'ai trouver quelquechose ;)
désolé, a tout a l'heure, jvais y réfléchir tout de même d'ici la et te préviens si j'ai trouver quelquechose ;)
ouais j'ai bien regardé il y a une dégénérescence du programme quand on augmente les lignes...je vais aller me renseigner là dessus. si tu as une idée n'hésite pas. en tout cas merci pour ton aide!
Bon j'ai compiler et tester avec un fichier test de 2 lignes, résultat, la première fois sa m'a renvoyer les bonnes valeurs, les 20 fois suivante sa ma renvoyer la même chose qu'a toi... Héhé... ^^
Je vais continuer a chercher, tu a un délai pour avoir une réponse ?
Je vais continuer a chercher, tu a un délai pour avoir une réponse ?