Problème de fgets
nico
-
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);
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
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
106485010510997108
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
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
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
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;
}
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;
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question