Pb de lecture de fichier "3D"

Signaler
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
Bonjour tout le monde!
J'ai le problème suivant:
je veux lire le fichier ci_dessous (entre les "-->", qui ne sont bien sûr pas dans le fichier), enregistré sous rouespos.txt .
voiture1,2,3,4 sont ... les noms des voitures (NAN ,sans dec'?)
les gros nombres sont les positions des 4 roues (XYZ), enregistrés en "double".

-->
voiture1
-29.50146441626099 18.77827301898406 7.505237161231101
-29.62943515514049 -18.44497884869858 7.505237161232468
32.62494709028103 -18.65900473023005 9.578808018798741
32.75291782916099 18.56424713745291 9.578808018797645

voiture2
-28.29060363033297 -19.1202535946866 9.129186596620253
-28.25809522021725 19.38137438296277 9.129186596621565
37.2135171934093 19.01725736610241 9.582248899336967
37.18126954594147 -19.17553402349085 9.582248899336028

voiture3
-34.3334998457147 18.71550390740256 9.266100402719975
-34.33349984571208 -18.71550390740478 9.266100402719644
31.81370608027729 -18.71550390740045 8.404245674979457
31.8137060802751 18.71550390740647 8.404245674979627

voiture4
-43.79599622370735 19.91996490954331 8.550955486743886
-43.79599622370741 -19.91996773702908 8.550955486744924
47.46255303554648 -19.91996773702878 7.849600747760739
47.46255303554621 19.91996490954339 7.849600747760821
-->

Du coup j'ai fait ce prog de lecture (cf plus bas), mais ca marche pas!!!
Je suppose que c'est encore une erreur toute con, mais j'y ai déja passé un nombre d'heures conséquent et ça m'énerve.
HELP ME PLEASE!!
Merci bcp d'avance.

PS: pour une lecture plus facile, mieux vaut faire copier-coller dans le notepad, les lignes sont un peu longues.

#include <windows.h>
#include <stdio.h>
#include <mbstring.h>
#include
int main(int argc, char* argv[])
{

typedef struct roues_params{
double NormalPos[3];
} roues_params;

typedef struct struct_cars_params {
roues_params roue[4];
} cars_params;
cars_params Originalcar[10];

FILE *rouepos;
rouepos=fopen("rouespos.txt","r");

// char carname[50];
for (int a=0;a<4;a++)
{
fscanf(rouepos,"%d%d%d\n%d%d%d\n%d%d%d\n%d%d%d\n\n ", &Originalcar[a].roue[0].NormalPos[0],&Originalcar[a].roue[0].NormalPos[1],&Originalcar[a].roue[0].NormalPos[2],
&Originalcar[a].roue[1].NormalPos[0],&Originalcar[a].roue[1].NormalPos[1],&Originalcar[a].roue[1].NormalPos[2],
&Originalcar[a].roue[2].NormalPos[0],&Originalcar[a].roue[2].NormalPos[1],&Originalcar[a].roue[2].NormalPos[2],
&Originalcar[a].roue[3].NormalPos[0],&Originalcar[a].roue[3].NormalPos[1],&Originalcar[a].roue[3].NormalPos[2]);

// vérification de certaines valeur, juste pour voir si ca a marché
cout << a<<":\n"<< Originalcar[a].roue[0].NormalPos[0] <<"\t"<< Originalcar[a].roue[0].NormalPos[1]<<"\t"<<Originalcar[a].roue[0].NormalPos[2]<<"\n\n";
}

// suite du prog
return 0;
}

4 réponses

Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
La methode du fscanf, je trouve ca pas tres propre, mais en tt kas, tu veux recup des nombres flottants alors pkoi tu passes %d a fscanf ?? %d =>> Nombres entiers int, met %f.

++

Bonne nuit
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Oulalala mais c'est du bordel !

AlexMan> Pour récuperer un double c'est %lf (long float) et pour un float c'est %f !!!

Arnaud16022> J'ai corrigé ton programme car il y avait un certains nombre d'erreur. Regarde tes structures elles sont plutot bizarres non ?
Pas besoin de tout ce chararbia pour definir des sous-structures.
Sinon j'ai aussi modifier la syntaxe de ton fichier.
J'ai separé les valeurs par des tabulations a la place des espaces. C'est plus lisible.
Mais tu peux tres bien remettre les espaces et modifier les "\t" par des espaces.

Donne des noms explicite a tes variables pour une compréhension plus facile.
Et pas besoin d'unclure 36 bibliothèques. Avec une seule ce que tu veux faire va très bien!

Bref, je vais pas te lister toute les erreurs. Compares ton code au miens tu les verras toi meme:

#include <stdio.h>

typedef struct {
double	x;
double	y;
double	z;
}ROUES;

typedef struct {
ROUES	NumRoues[4];
char	Marque[256];
} VOITURE;

int main(int argc, char* argv[])
{
FILE*	fpVoiture;
VOITURE V[4];

// On ouvre le fichier en lecture et mode texte
fpVoiture = fopen("d:\\rouespos.txt","r+t");

//Les valeurs sont récuperés par syntaxe(i.e: MARQUE\nROUES.POS.X\tROUES.POS.Y\tROUES.POS.Z\n\n)
for(int i=0;i<4;i++)
{
fscanf(fpVoiture,"%s\n%lf\t%lf\t%lf\n%lf\t%lf\t%lf\n%lf\t%lf\t%lf\n%lf\t%lf\t%lf\n\n",&V[i].Marque,&V[i].NumRoues[0].x, &V[i].NumRoues[0].y, &V[i].NumRoues[0].z,
   &V[i].NumRoues[1].x, &V[i].NumRoues[1].y, &V[i].NumRoues[1].z,
   &V[i].NumRoues[2].x, &V[i].NumRoues[2].y, &V[i].NumRoues[2].z,
   &V[i].NumRoues[3].x, &V[i].NumRoues[3].y, &V[i].NumRoues[3].z);						  							 					    
}

//Pour bonne verification, on affiche les 6 premieres décimales de chaque premiere nombre de la premiere ligne
for(i=0;i<4;i++)
{
printf("%s\n%0.6f\t%0.6f\t%0.6f\n\n",V[i].Marque,V[i].NumRoues[0].x,V[i].NumRoues[0].y,V[i].NumRoues[0].z);
}

return 0;
}


A++ et bonne continuation.

Shell
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
c'est bien mieux comme ca, trop crade ton truc Arnaud16022, et passe en binaire, ca cimplifira la lecture et l'ecriture dans le fichier et pas de perte de precision

fread( V, sizeof V[0] * sizeof V, 1, fpVoiture);
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
cOOOl

Merci bcp

La lecture/ecriture de fichiers, cŽest un des trucs qui m'embete le plus... et ca se voit...

je ne veux pas encore passer en binaire, parce que ces valeurs , je veux pouvoir les modifier manuellement,sans etre obligé de passer par un autre prog;

sinon les 2 classes c'etait fait exprès (je les ai TRES simplifiées pour poser la question)

Et desole pour le temps de reponse,mais je suis un peu con sur les bords, j'ai pose ma question 2 heures avant de partir en vacances en Autriche, que j'ai mis une semaine pour trouver un cafe internet (c'est un trou perdu au fond de la montagne...)

Merci encore

Je verrai ca dans une semaine ;)

Ciao

PS: c'etait gentil de me corriger la fonction d'affichage mais je l'ai fait a la nimp; juste pour montrer que ca marchait pas.

PS2: je hais ces claviers qwertz !