L'allocation mémoire ne marche pas bien

[Résolu/Fermé]
Signaler
Messages postés
228
Date d'inscription
vendredi 31 juillet 2015
Statut
Membre
Dernière intervention
24 février 2017
-
Messages postés
228
Date d'inscription
vendredi 31 juillet 2015
Statut
Membre
Dernière intervention
24 février 2017
-
Bonjour,
J'aimerais allouer mon fichier dans une matrice. J'ai essayé de faire ça mais le résulta est que ça m'affiche à partir de la 2ème ligne du fichier et après ça bug.
Pourquoi ?
Voici le code :
/* Fichiers d'en-tête */
#include <stdlib.h>    // Génération nbres aléatoires, allocation dynamique mémoire
#include <stdio.h>    //  Gestion erreurs et E/S (scanf, printf)
#include <math.h>  //   Fonctions mathématiques
#include <string.h>
#define TAILLE_MAX  4700
// 1ère étape : Chargement du fichier IRIS DATA ==> pas OK
int main()
 {    /* Descripteur fichier */
     FILE* fichier = NULL;
  
  /* Ouverture fichier */
     fichier = fopen("iris_data.txt", "r+");
 
     if (fichier != NULL)
     {
      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"
      {  
         // On peut lire et écrire dans le fichier
         printf("Le fichier IRIS DATA est ouvert \n");
         
          
    /*----------------- Etape 2 : Allocation mémoire--------------------*/
      /* Allocation mémoire d'un tableau de 100 valeurs flottantes */
    double** vect;
    if  ( ( vect =malloc(100*sizeof(**vect) ))== NULL)
    {
     printf("Il n'y a pas assez de mémoire !\n ");
     exit(EXIT_FAILURE); 
    }
    printf("La memoire est allouee! \n");
    //exit(EXIT_SUCCESS);
    
    
    
           // indice
         int i=0;
   for (i=0;i<=149;i++){
  
   printf("vecteur numero %d \n",i);
   printf("----------------------------------------\n");
   
      fscanf(fichier, "%lf ,%lf ,%lf ,%lf", &vect[i][0], &vect[i][1], &vect[i][2], &vect[i][3]);
   printf("Le vecteur de donnees %d est : %f,%f,%f,%f \n",i, vect[i][0], vect[i][1], vect[i][2], vect[i][3]);
         }
         
    }
  }
  else {                                                                                                                        
         // On affiche un message d'erreur si on veut
         printf("Impossible d'ouvrir le fichier iris_data.txt");
      }
  
    return 0;
}

Merci

1 réponse

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 786
Bonjour,

Sans connaître la structure du fichier, c'est difficile de t'aider.
Néanmoins, quelques pistes :

int main()
Le bon prototype est int main(void)

double** vect;
L'allocation n'est pas complète. Tu as alloué le nombre de lignes, mais pas le nombre de colonnes. Il faut faire une boucle for pour allouer de 4 cases chacune des lignes allouées.

exit(EXIT_FAILURE);
Utilise plutôt return EXIT_FAILURE;

for (i=0;i<=149;i++){
Tu fais une allocation de 100 lignes et là, tu itères sur 150 lignes...

fscanf(fichier, "%lf ,%lf ,%lf ,%lf", ...)
Tu as fait un fgets() dans ton while et là, tu refais un fscanf()... Autrement dit, tu lis une ligne pour rien... Utilise plutôt sscanf(chaine, "%lf..."...) pour parser la chaîne sauvegardée plutôt que de lire une ligne de plus dans le fichier.

Attention à l'indentation qui est hasardeuse. Ce n'est pas pratique pour nous de lire...

Cdlt,
Messages postés
228
Date d'inscription
vendredi 31 juillet 2015
Statut
Membre
Dernière intervention
24 février 2017

Bonjour,
- La librairie math.h me servira plus tard avec sqrt.
- "j" est inutile c'est vrai.
Alors ce que j'ai comme résultat c'est :
- Le résultat ne s'affiche qu'à partir de la ligne 91!
- Mes messages précédents :
printf("Le fichier IRIS DATA est ouvert \n");
printf("Espace alloue \n");
ne s'affichent pas!
Les resultats sont : 30.250000
Le vecteur de donnees 91 est : 6.100000, 3.000000, 4.600000, 1.400000

-------------------CARRE---------------------
Les resultats sont : 37.210000
Le vecteur de donnees 92 est : 5.800000, 2.600000, 4.000000, 1.200000

...etc jusqu'au vecteur 149
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 786
Es-tu sûr que l'historique de ta console soit suffisamment grand ? Redirige le contenu dans un fichier plutôt qu'à l'écran.
Messages postés
228
Date d'inscription
vendredi 31 juillet 2015
Statut
Membre
Dernière intervention
24 février 2017

Merci pour ta réponse.
Ma console était suffisamment grande pour avoir affiché les 150 lignes mais après avoir rajouté ces messages non.
En fait, mon but c'est de changer directement les valeurs du tableau. Je pensais que c'était possible de tout afficher sur une console, je ne vois pas à quoi sert l'allocation dans ce cas ?
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 786
Euh, aucun rapport...
L'allocation d'un pointeur est une chose, l'historique de ta console en est une autre.
Un pointeur est un mécanisme en C permettant de pointer sur une zone. Encore faut-il que créer la zone (c'est l'allocation via malloc()). Cette partie-là est ok dans ton programme.
Tous tes printf() s'affichent sur ta console windows. Sauf que celle-ci à un historique. Au bout de plusieurs lignes qui s'affichent, tu ne vois plus les premières...
Pour vérifier ça, mets un simple system("pause"); juste après le i++; de ta boucle while().
Messages postés
228
Date d'inscription
vendredi 31 juillet 2015
Statut
Membre
Dernière intervention
24 février 2017

Ah je comprends, merci beaucoup!
Je peux faire des calculs sans devoir tout afficher :P