Fgets saute des lignes

Résolu/Fermé
rabah200830 - 3 déc. 2012 à 19:58
totof31 Messages postés 163 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 30 avril 2013 - 6 déc. 2012 à 16:26
Bonjour,
Voila j'ai écrit le code suivant :

instance lire (char *nom_fichier)
{
     instance c;
     FILE * f = fopen(nom_fichier,"r");
     bool distances = false;
     bool cord = false;
     int t=0;
     char ch[MAX];
     if (f != NULL)
     {
       while(!feof(f))
           {
              fgets(ch,MAX,f);
	      printf("ch  %s",ch);
              if(commence_avec(ch,"NAME:")){
            	   enlever(ch,c.nom,5);
               }
               
               if(commence_avec(ch,"DIMENSION:")){
		   char ch2[MAX];
                   enlever(ch,ch2,10);
               	   c.nombre = atoi(ch2); //instruction qui provoque les sautes 
               }
               if(!(strcmp("EDGE_WEIGHT_SECTION\n",ch))){
                   int i;
		    printf("j'ai trouve\n");
            	   for(i=0;i<c.nombre;++i){
		    
            			   fgets(ch,MAX,f);
            			   char tab[MAX][MAX];
            			   int k;
            			   decoupe(ch,' ',tab,&k);
            			   int j;
            			   for(j=0;j<k;++j){
            			       c.distances[i][j] = atof(tab[j]);
            			       //printf("%f  ",c.distances[i][j]);
            			   }
            			   printf("\n");

            	   }
            	   distances = true;
               }
               t++;
               if(strcmp("DISPLAY_DATA_SECTION",ch)){
                   int i;
            	   for(i=0;i<c.nombre;++i){
            	       fgets(ch,MAX,f);
            	       char tab[MAX][MAX];
            	       int k;
            	       decoupe(ch,' ',tab,&k);
            	       int j;
            	       for(j=0;j<3;++j){
            	       c.cor[i][j] = atof(tab[j]);
            	       cord = true;
            	               			   }

            	               	   }
               }

               if(!distances && cord){
               calcule_distances(c.cor,c.distances,c.nombre);
               }
	   }


           fclose(f);
           }
           printf("t= %d\n",t);
           return c;
     }


Au début la lecture se fait normalement (ligne par ligne) et juste après que l'instruction qui j'ai marqué dans le code (l'instruction qui provoque les sauts) est exécutée la fonction fgets sauts des lignes. Si par exemple après l'exécution de l'instruction c.nombre devient égale à 29 alors fgets saute 29 ligne à chaque lecture. Je ne sais pas d'où vient le problème. Quelqu'un pourrait m'aider?

Voila le code des fonction decoupe et enlever et commence_avec :
void enlever (char *ch1,char ch2[], int debut){
	int i=0;
	int j=0;
	char c;
	bool espace;
     do
     {
    	 c = ch1[debut+i];
    	 if(c != ' ' && !espace){
    	      ch2[j] = c;
    	      espace = false;
    	      j++;
    	 }
    	 i++;
     }while(c != '\0');

     }


bool commence_avec(char * ch1,char *ch2){
     int i=0;
     while(ch1[i] !='\0' && ch2[i] !='\0')
     {
         if(ch1[i] != ch2[i]) return false;
         i++;
     }
     return true;
}


void decoupe (char *ch,char c,char tab[MAX][MAX],int *k){
	bool espace = false;
	int j=0;
	*k =1;
	int i=0;
	while(ch[i] !='\0'){
		char car = ch[i];
		if(car == c){
           if(c !=' ' || !espace){
		    tab[*k-1][j] = '\0';
		    j=0;
		    *k = *k+1;
			}
		}
		else{
            tab[*k-1][j] = car;
			espace = false;
			j++;
		}
		if(car == ' ') espace =true;
		i++;
		}

	}


Le problème ne vient pas de ces fonctions car je bien vérifié en les mettant en commentaire et en affectant une valeur à c.nombre et j'ai le même résultat.

Le problème ne vient pas aussi de fait qu'il y a trois fgets puisque les deux dernières ne sont pas exécutées puisque la condition n'est jamais satisfait en sautant 29 lignes.


Merci pour vos réponses

Cordialement.


3 réponses

Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
3 déc. 2012 à 20:34
Bonsoir rabah200830,
Travailles-tu sous Linux ?
Essaie en ajoutant "fgetc(stdin);" avant ton fgets"..";
0
totof31 Messages postés 163 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 30 avril 2013 74
4 déc. 2012 à 08:54
Bonjour,
Entre :
if(!(strcmp("EDGE_WEIGHT_SECTION\n",ch))){
et
if(strcmp("DISPLAY_DATA_SECTION",ch)){

es-tu certain qu'il n'y a pas un "!" en trop ou en moins ? Je pencherais bien pour la première solution...
0
Bonsoir

En fait l'erreur se trouve à l'instruction :
if(strcmp("DISPLAY_DATA_SECTION",ch))

il faut mettre :
if(strcmp("DISPLAY_DATA_SECTION",ch)==0)


Merci pour vos réponses.

Cordialement.
0
totof31 Messages postés 163 Date d'inscription lundi 29 octobre 2012 Statut Membre Dernière intervention 30 avril 2013 74
6 déc. 2012 à 16:26
Ah bah c'était la 2ème solution finalement !
Merci pour le retour
0