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
    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
      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;

        }