Besoin d'aide en c+

Fermé
nikolai - 30 juin 2009 à 12:34
speed22 Messages postés 33 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 15 juillet 2009 - 3 juil. 2009 à 16:15
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!




#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

speed22 Messages postés 33 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 15 juillet 2009
30 juin 2009 à 13:08
Le "." qui sépare les nombres est génant étant donner que tu utilise des variables de type entier/double
0
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?
0
speed22 Messages postés 33 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 15 juillet 2009
30 juin 2009 à 14:21
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
0
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 ?
0

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

Posez votre question
speed22 Messages postés 33 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 15 juillet 2009
30 juin 2009 à 14:34
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 ;)
0
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
0
speed22 Messages postés 33 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 15 juillet 2009
30 juin 2009 à 14:44
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
0
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?
0
speed22 Messages postés 33 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 15 juillet 2009
30 juin 2009 à 14:59
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 ^^
0
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 ^^
0
j'ai essayé de ne garder que 3 lignes sur les 2776 et là le programme renvoie les bonnes valeurs...
bizarre non?
0
speed22 Messages postés 33 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 15 juillet 2009
30 juin 2009 à 15:12
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 ?
0
certain. d'ailleurs pour la 3ème colonne il ne renvoie aucune valeur supérieur à 810 alors qu'il y en a beaucoup!
0
speed22 Messages postés 33 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 15 juillet 2009
30 juin 2009 à 15:29
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 ;)
0
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!
0
speed22 Messages postés 33 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 15 juillet 2009
1 juil. 2009 à 09:31
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 ?
0
Nikolai51 Messages postés 1 Date d'inscription mardi 30 juin 2009 Statut Membre Dernière intervention 1 juillet 2009
1 juil. 2009 à 09:33
bonjour,

non pas vraiment de délai. je poursuivre la suite de mon programme et si on trouve une réponse je modifierai le début.
merci en tt cas!
0
salut,
tas reussi a trouver une piste alors?
0
speed22 Messages postés 33 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 15 juillet 2009
3 juil. 2009 à 16:15
Pour l'instant je cale, j'ai regarder avant hier, mais pas hier parce que j'ai été inondé :) ^^

Je regarde ce week end plus profondément ;) ou même ce soir après le boulot !
0