Pourquoi je n'arrive pas à lire mon fichier ligne par ligne

Résolu/Fermé
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 - 25 déc. 2015 à 19:50
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 - 26 déc. 2015 à 20:09
Bonjour,
Dans mon code, je n'arrive à lire que la 1ère ligne de mon fichier (ce sont des float séparés par des virgules).
Je n'arrive pas à lire le reste du fichier, tout est à zéro.
J'utilise la fonction scanf.
Je pense que le programme ne comprend pas qu'il doit aller vers la ligne suivante.
J'ai essayé while (fichier != EOF), mais j'ai une erreur.

Voici le code :
/* Fichiers d'en-tête */
#include <stdlib.h>    
#include <stdio.h>    
#include <math.h>	
#include <string.h>

int main(int argc, char *argv[])
{  
    FILE* fichier = NULL;
	
    /* Ouverture fichier */
    fichier = fopen("iris_data.txt", "r+");

    if (fichier != NULL)
    {
        // On peut lire et écrire dans le fichier
        printf("Le fichier IRIS DATA est ouvert \n");
        
        int i;        
	float vect[150][4] = {0};  //vecteur du fichier 150 lignes et 4 colonnes

	for (int j=0;j<=149;j++)
	{
	fscanf(fichier, "%f ,%f ,%f ,%f", &vect[j][0], &vect[j][1], &vect[j][2], &vect[j][3]);
	printf("Le vecteur de donnees %d est : %f,%f,%f,%f \n",j, vect[j][0], vect[j][1], vect[j][2], vect[j][3]);
	}
	
 }                              
    else         
    {
	
        // On affiche un message d'erreur si on veut
        printf("Impossible d'ouvrir le fichier iris_data.txt");
    }

    return 0;
}


A voir également:

2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
25 déc. 2015 à 20:34
Bonjour,

Je te conseille plutôt d'utiliser fgets() pour lire la ligne entièrement.
Puis pour récupérer les flottants, utilise sscanf().
Note : je te conseille aussi d'utiliser double plutôt que float.
0
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
25 déc. 2015 à 20:41
Merci pour ta réponse.
Je vais essayer fgets.
En utilisant double, le résultat n'apparaît pas (0.00000), par contre avec float ça marche.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
25 déc. 2015 à 20:52
En utilisant double, le résultat n'apparaît pas (0.00000)
Si ça marche pas avec double, tu l'as probablement mal utilisé.
Au hasard, je dirais que tu as oublié de mettre "%lf" (L minuscule) dans le scanf().
0
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
25 déc. 2015 à 21:00
C'est exactement ça, j'ai mis %f :P
Maintenant ça marche merci bcp :)
0
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
Modifié par geekat le 26/12/2015 à 00:28
J'ai essayé fgets et sscanf.
Je lis bien ligne par ligne, puis j'extrais bien les float.
Maintenant, j'aimerais faire des opérations mathématiques avec ces floats de chaque ligne.
Le souci c'est que ça s'affiche mal, beaucoup lignes ne sont pas calculées.
J'ai un autre souci, les 19 premières lignes ne sont pas lues, c'est un peu bizarre, toutes les suivantes sont affichées, et toutes les lignes ont la même syntaxe.

/* Fichiers d'en-tête */
#include <stdlib.h>    
#include <stdio.h>    
#include <math.h> 
#include <string.h>
#define TAILLE_MAX  4700

int main(int argc, char *argv[])
{  
    FILE* fichier = NULL;
 
    /* Ouverture fichier */
    fichier = fopen("iris_data.txt", "r+");

    if (fichier != NULL)
    {
        // On peut lire et écrire dans le fichier
        printf("Le fichier IRIS DATA est ouvert \n");
        
       char chaine[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
 
    while(fgets(chaine, TAILLE_MAX, fichier)!= NULL)  // On lit maximum TAILLE_MAX caractères du fichier, on stocke le tout dans "chaine"
    { printf("%s", chaine); // On affiche la chaîne
          
    double nombre1 = 0.0;
    double nombre2 = 0.0;
    double nombre3 = 0.0;
    double nombre4 = 0.0;
 
    sscanf(chaine, "%lf,%lf,%lf,%lf", &nombre1, &nombre2, &nombre3, &nombre4);
    printf("Chaine: %s, nombre1: %lf, nombre2: %lf, nombre3: %lf, nombre4: %lf\n", chaine, nombre1, nombre2, nombre3, nombre4);


   /* Cette partie ci-dessous donne de faux résultats */
  double resultat[4];
  float vect[4] = {nombre1,nombre2,nombre3,nombre4};
  /*-----Carré -------*/
  for(int i=0;i<=3;i++) 
   { 
   resultat[i] = (vect[i]*vect[i]);
   printf("Les résultats sont : %f \n", resultat[i]); 
   }
  }
  }                              
    else         
    {
 
        // On affiche un message d'erreur si on veut
        printf("Impossible d'ouvrir le fichier iris_data.txt");
    }

    return 0;
}


0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
26 déc. 2015 à 01:07
Bonjour,

printf("Chaine: %s, nombre1: %lf
Ce n'est pas %lf (L minuscule) qu'on met dans les printf() mais "%f".
float vect[4] = {nombre1,nombre2,nombre3,nombre4};
nombre1,... sont des double alors que vect[...] est un float.
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
26 déc. 2015 à 18:21
Création fichier
for j in {1..150} ; do for i in 1 2 3  ; do echo -n ${RANDOM}.${RANDOM} ; echo -n ","  ; done ; echo ${RANDOM}.${RANDOM}  ; done > iris_data.txt


Chez moi, le code:
/* Fichiers d'en-tête */
#include <stdlib.h>    
#include <stdio.h>    
#include <math.h>	
#include <string.h>

#define N 150

int main(int argc, char *argv[])
{  
  FILE* fichier = NULL;
	
  /* Ouverture fichier */
  fichier = fopen("iris_data.txt", "r+");

  if (fichier != NULL)
    {
      // On peut lire et écrire dans le fichier
      printf("Le fichier IRIS DATA est ouvert \n");
        
      float vect[N][4] = {0};  //vecteur du fichier 150 lignes et 4 colonnes

      for (int j=0; j < N; j++)
	{
	  printf("j=%d\n", j);
	  fscanf(fichier, "%f,%f,%f,%f", &vect[j][0], &vect[j][1], &vect[j][2], &vect[j][3]);
	  printf("Le vecteur de donnees %d est : %f,%f,%f,%f \n",j, vect[j][0], vect[j][1], vect[j][2], vect[j][3]);
	}
      fclose(fichier);
    }                              
  else         
    {
	
      // On affiche un message d'erreur si on veut
      printf("Impossible d'ouvrir le fichier iris_data.txt");
    }

  return 0;
}


Output:
johand@bata:~/src/CCM/C$ tail -5 iris_data.txt
5096.7451,1813.11470,17569.30483,9066.15078
5881.30140,11696.11156,16034.14270,22747.16579
30571.16016,10461.1037,3768.7017,11475.8207
30971.828,9449.25670,26610.1357,14729.10280
2713.6559,28056.16958,17896.16688,30959.14626
johand@bata:~/src/CCM/C$ ./float150 | tail -5
Le vecteur de donnees 145 est : 5096.745117,1813.114746,17569.304688,9066.150391
Le vecteur de donnees 146 est : 5881.301270,11696.111328,16034.142578,22747.166016
Le vecteur de donnees 147 est : 30571.160156,10461.103516,3768.701660,11475.820312
Le vecteur de donnees 148 est : 30971.828125,9449.256836,26610.134766,14729.102539
Le vecteur de donnees 149 est : 2713.656006,28056.169922,17896.166016,30959.146484
0
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
26 déc. 2015 à 19:03
Merci pour ta réponse.
En exécutant ton code, j'ai des résultats commençant par j=2. Toujours un problème de buffer pour j=0 et j=1, je n'ai pas d'affichage.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
26 déc. 2015 à 19:37
Tu as suivi mes conseils en mettant un getchar() dans le while() ?
0
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
Modifié par geekat le 26/12/2015 à 19:47
Oui. J'ai essayé :
    char c=getchar() ;
    while(fgets(chaine, TAILLE_MAX, fichier)!= NULL && c !="\n")

J'ai toujours un problème de buffer et un warning comparaison between pointer and integer.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
26 déc. 2015 à 19:49
Plusieurs erreurs.
Ta variable c est un char. "\n" n'est pas un caractère mais une chaîne. D'où le warning.
Il faut donc plutôt mettre '\n' (apostrophes). De plus, lorsque tu fais char c; tu déclares une variable sans l'initialiser et tu l'utilises... Comportement aléatoire.
Sinon, je n'arrive pas à faire le lien entre ma demande et ton code ?
Ce que je dis est de mettre un getchar() dans ta boucle.
Teste plutôt :
<code c>
for (...) {
...
getchar();
}
0
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
26 déc. 2015 à 20:04
Ah oui d'accord.
J'ai retesté. ça marche :)
Chaque fois que je clique sur une touche, j'ai la ligne suivante
Lorsque j'écris 2 caractères, j'ai 2 lignes qui s'affichent ...etc
0