Problème de fgets

Bonjour,
je suis en train de faire un programme qui compte le nombre de ligne dans un fichier et d'allouer l'espace mémoire pour mettre ce qui est interressant dans un tableau
Le probléme parce qu'il y en a un, c'est que je ne rentre pas dans la boucle while qui me permet de retranscrire les infos du fichier dans le tableau

fic = fopen (source, "r");
if (fic)

{

i=0;

ligne=(char*)malloc(sizeof(char));

while (fgets(ligne,256,fic)!= NULL)

{

length++;

}
printf("%f\n",1.0);
while (fgets(ligne,256,fic)!= NULL)

{

if(ligne!=NULL)

{

ptr=split(ligne,"=",0);

tab=(float*)malloc(length*sizeof(float));

f=atof(ptr[1]);

tab[i]=f;
printf("%f\n",0.0);
}

i++;

}

}

close(fic);

5 réponses

  1. Modérateur
    Salut,

    c'est normal, une fois le fichier parcouru il faut revenir au début pour pouvoir le relire ou ouvrir un autre pointeur sur le fichier.

    si tu as déclaré char *ligne alors sache que
    ligne=(char*)malloc(sizeof(char));
    n'alloue qu'un seul octet
    tu devras plutôt écrire
    ligne=(char*)malloc(256*sizeof(char)); 
    --
    106485010510997108
    0
    1. oui c'est bien ce que j'ai pensé
      j'ai donc essayé de faire un
      fic-=length
      pour revenir au début mais y'a une erreur de segmentation donc là je vois pas trop comment faire
      0
      1. Modérateur
        tu peux donner le code complet?
        0
        1. j'ai juste un split en plus

          char** split(char* chaine,const char* delim,int vide){

          char** tab=NULL; //tableau de chaine, tableau resultat

          char *ptr; //pointeur sur une partie de

          int sizeStr; //taille de la chaine à recupérer

          int sizeTab=0; //taille du tableau de chaine

          char* largestring; //chaine à traiter

          int sizeDelim=strlen(delim); //taille du delimiteur

          largestring = chaine; //comme ca on ne modifie pas le pointeur d'origine

          while((ptr=strstr(largestring, delim))!=NULL ){

          sizeStr=ptr-largestring;

          //si la chaine trouvé n'est pas vide ou si on accepte les chaine vide

          if(vide==1 || sizeStr!=0){

          //on alloue une case en plus au tableau de chaines

          sizeTab++;

          tab= (char**) realloc(tab,sizeof(char*)*sizeTab);

          //on alloue la chaine du tableau

          tab[sizeTab-1]=(char*) malloc( sizeof(char)*(sizeStr+1) );

          strncpy(tab[sizeTab-1],largestring,sizeStr);

          tab[sizeTab-1][sizeStr]='\0';

          }

          //on decale le pointeur largestring pour continuer la boucle apres le premier elément traiter

          ptr=ptr+sizeDelim;

          largestring=ptr;

          }

          //si la chaine n'est pas vide, on recupere le dernier "morceau"

          if(strlen(largestring)!=0){

          sizeStr=strlen(largestring);

          sizeTab++;

          tab= (char**) realloc(tab,sizeof(char*)*sizeTab);

          tab[sizeTab-1]=(char*) malloc(sizeof(char)*(sizeStr+1) );

          strncpy(tab[sizeTab-1],largestring,sizeStr);

          tab[sizeTab-1][sizeStr]='\0';

          }

          else if(vide==1){ //si on fini sur un delimiteur et si on accepte les mots vides,on ajoute un mot vide

          sizeTab++;

          tab= (char**) realloc(tab,sizeof(char*)*sizeTab);

          tab[sizeTab-1]=(char*) malloc( sizeof(char)*1 );

          tab[sizeTab-1][0]='\0';

          }

          //on ajoute une case à null pour finir le tableau

          sizeTab++;

          tab= (char**) realloc(tab,sizeof(char*)*sizeTab);

          tab[sizeTab-1]=NULL;

          return tab;

          }
          0