Recuperation de donnes sur fichier texte

semnos21 Messages postés 2 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 7 août 2007 - 3 août 2007 à 21:17
semnos21 Messages postés 2 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 7 août 2007 - 7 août 2007 à 16:14
 Bonjour,
poru certain d'entre vous ce que je vais demander va paraitre simple, ca tombe bien, j'en ai marre de me casser les dents et de perdre du temps la dessus... ---> codage en C
(dsl il n'y aura pas d'accent.. cause:qwerty de .....)

<hr size="2" width="100%" />
1.0    0.987    -12.7    6.651    169.6    0.019    81.2    0.504    -9.6
2.0    0.972    -25.2    6.514    160.5    0.038    73.7    0.497    -19.6
3.0    0.954    -38.0    6.378    151.5    0.054    66.6    0.482    -30.0
24.0    0.783    141.4    2.060    21.1    0.132    -31.2    0.294    145.9
25.0    0.787    139.2    1.965    17.3    0.133    -32.9    0.300    140.6
31.0    0.755    126.3    1.655    -3.9    0.130    -45.6    0.362    121.5
<hr size="2" width="100%" />voila le fichier en cause, maintenant je vous explique:
Je doit recuperer ces donnees dans un tableau de structure, c'est ce qui me semblais le mieu convenir, avec pour chaque ligne la frequence(1er colone), et par groupe de deux des valeurs (amplitude et angle pour les quatres cases d'une matrice...).
Si jusque la vous avez suivi j'ai une chance...

voici la structure
<hr size="2" width="100%" />typedef struct S_mat
{
        double freq;
        double S_ang[4];
        double S_amp[4];
} S_mat;
<hr size="2" width="100%" />
voici mon bout de code foireux, enfin qui tourne daans une boucle qui me place au debut de chaque ligne...
<hr size="2" width="100%" />fscanf(fichier,"%f%f%f%f%f%f%f%f%f", &tableau_S[i].freq, &tableau_S[i].S_amp[0], &tableau_S[i].S_ang[0], &tableau_S[i].S_amp[1], &tableau_S[i].S_ang[1], &tableau_S[i].S_amp[2], &tableau_S[i].S_ang[2], &tableau_S[i].S_amp[3], &tableau_S[i].S_ang[3]);
printf("Frequence:%2.2f S11: %4.4f , %4.4f S12: %4.4f , %4.4f S21: %4.4f , %4.4f S22: %4.4f , %4.4f \n",tableau_S[i].freq,tableau_S[i].S_amp[0],tableau_S[i].S_ang[0],tableau_S[i].S_amp[1],tableau_S[i].S_ang[1],tableau_S[i].S_amp[2],tableau_S[i].S_ang[2],tableau_S[i].S_amp[3],tableau_S[i].S_ang[3]);

<hr size="2" width="100%" />Sur ce coup ci game over, pas de probleme, je em suis dit que j'avais ete un peu barbar...deuxieme essai plus soft: la aussi... banzai les valeurs de l'espace...
<hr size="2" width="100%" />                    fscanf(fichier,"%f",&(tableau_S[i].freq));
                    fscanf(fichier," %f",&(tableau_S[i].S_amp[0]));
                    fscanf(fichier," %f",&(tableau_S[i].S_ang[0]));
                    fscanf(fichier," %f",&(tableau_S[i].S_amp[1]));
                    fscanf(fichier," %f",&(tableau_S[i].S_ang[1]));
                    fscanf(fichier," %f",&(tableau_S[i].S_amp[2]));
                    fscanf(fichier," %f",&(tableau_S[i].S_ang[2]));
                    fscanf(fichier," %f",&(tableau_S[i].S_amp[3]));
                    fscanf(fichier," %f",&(tableau_S[i].S_ang[3]));
<hr size="2" width="100%" />
Dernier recours... HEEELLLPPPP ...
J'ai du foirer la fonction scanf possible, mais tout ce que j'ai trouve dessus est un poil confu...
Ensuite utiliser de fgetc ou fgets... je trouvais ca aleatoire vu que les tailles de chaines sont a +-1 pres et que les gentils caractere genre '.' et '-' faut les gerer au cas par cas.... moi je me suis dit que ca me prendrais une semaine.. ca tombe mal me reste a peu pres moitie moins...
Voilou le probleme, je verifie que je n'ai pas laisse de variable ou autre obscure...
Ah si le 'i' qui se promene est incremente a chaque iteration de la boucle qui me place en debut de ligne (c'est une verification car il y a des lignes de texte dans le fichier dont je me tape royal.)

Sur ce, si quelqu'un a une solution ^^ amen, sinon, bah je suis pas dans le petrin moi...

Merci
Semnos21
(paul.g1987@gmail.com si c plus simple pour certain)

PS: si il y a deja je n'ai pas trouve ma reponse dsl

5 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
3 août 2007 à 23:04
essaie %lf au lieu de %f car lecture de double.
0
Cyr62110 Messages postés 65 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 21 octobre 2009
4 août 2007 à 09:41
Avec fgetc :
int current_boucle = 0;
int current_var= 0;
int current_char = 0;
double dbuf = 0;
char cbuf = NULL;
char* pcbuf = NULL;
pcbuf = malloc(20*sizeof(char));
for(;;)
{
cbuf = fgetc(fichier);
if(cbuf ' ' || cbuf (char)10)
{
pcbuf[current_char] = NULL;
current_char = 0;
dbuf = atof(pcbuf);
switch(current_var)
{
case 0:
tableau[i].freq = dbuf;
break;
case 1:
tableau[i].S_amp[current_boucle] = dbuf;
break;
case 2:
tableau[i].S_ang[current_boucle] = dbuf;
break;
}
current_var++;
free(pcbuf);
if(current_var == 3)
{
current_boucle++;
current_var = 0;
}
if(current_boucle == 4)
{
current_boucle = 0;
break;
}
pcbuf = malloc(20*sizeof(char));
continue;
}
pcbuf[current_char] = cbuf;
current_char++;
}
Bye
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
5 août 2007 à 21:12
ça fuit ces malloc en rafale.
De plus toujours vérifier que malloc réussit.
Remplacer le tout par char pcbuf[20]; même si fcanf() est plus élégant.
0
Cyr62110 Messages postés 65 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 21 octobre 2009
6 août 2007 à 09:47
Désolé pour toi mais je libére la mémoire :
current_var++;
free(pcbuf);
et ensuite je vérifie à quelle variable je suis arrivé, si c'est la troisieme j'incrémente current_boucle.
Et si current_boucle est arrivé au maximum, je casse la boucle.
Donc il n'y as pas besoin de remettre un free();.
Bye.
P.S:Je préfére cette methode car peut importe le séparateur des variable, on peut toujours adapter la methode rapidement.
0

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

Posez votre question
semnos21 Messages postés 2 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 7 août 2007
7 août 2007 à 16:14
Bon bah merci, il semblerai que l'utilisation du %lf a la place des %f suffise, je vais pousser quelques tests, voir si y'a pas de chausse trappe mais ca semble fonctionner... chui blase d'etre reste coince la dessusm, mais Merci a tous
0
Rejoignez-nous