Problème de fgets

nico -  
 nico -
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. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. nico
     
    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
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    tu peux donner le code complet?
    0
  4. nico
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question