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

Résolu
geekat Messages postés 228 Date d'inscription   Statut Membre Dernière intervention   -  
geekat Messages postés 228 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846 > geekat Messages postés 228 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
C'est exactement ça, j'ai mis %f :P
Maintenant ça marche merci bcp :)
0
geekat Messages postés 228 Date d'inscription   Statut Membre Dernière intervention   > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846 > geekat Messages postés 228 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Modérateur Dernière intervention   934
 
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   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846
 
Tu as suivi mes conseils en mettant un getchar() dans le while() ?
0
geekat Messages postés 228 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846 > geekat Messages postés 228 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
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