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

lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
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
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
tu peux donner le code complet?
0
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nico
 
toujours pas de réponse?
0