IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Entrée dans un While


Sujet :

C

  1. #1
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Par défaut Entrée dans un While
    Bonjour Développeurs,

    J'ai tenté de faire un script qui me permettait de lire un fichier d'abord par ligne, ensuite par caractère afin de récupérer certaines données du fichier.

    Le fait est que mon fichier est de forme suivante :
    $une ou plusieurs lignes de commentaire pré-signalées par "$"
    000110110111010#
    ceci est la dernière ligne du fichier
    # me déterminant la fin de la ligne des données, ce que je souhaite récupérer.

    J'ai donc fait ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #include <stdio.h>																	//Appel de la librairie Input/Output
    #include <stdlib.h>																	//Appel de la librairie Standard
    #include <string.h>																	//Appel de la librairie String
    
    #include "dblist.h"																	//Ajout des Listes Doublements Chainees
    
    int main()
    {
    
    	dblist *listeDC = malloc(sizeof(dblist));										//Declaration de la liste doublement chainee 
    	Init(listeDC);																	//Initialisation de la liste doublement chainee
    	FILE *fichierDonnees = fopen("donnees.txt", "r");								//Déclaration et instanciation d'un pointeur de type fichier vers les donnees
    	char caractere;																	//Déclaration d'une variable caractere
    	int compteur;																	//Declaration et initialisation d'un compteur
    	int finDonnees = 0;																//Déclaration et initialisation d'une variable "booleene" permettant d'arreter la lecture du fichier après avoir lu les donnees
    	char ligne[64];																	//Espace temporaire pour récupérer une ligne d'un fichier
    
    		////Traitement des donnees////
    			if(fichierDonnees != NULL)												//Ouverture du fichier réussie
    			{
    				// Lecture des lignes du fichier de donnees
    puts("Ouverture fichier ok");
    				while((fgets(ligne, sizeof ligne, fichierDonnees) != NULL) && (finDonnees = 0))
    				{																	//Tant que l'on peut lire une ligne du fichier et que la variable "booleene" finDonnees est a faux
    puts("passage while");
    					caractere = ligne[0];											//Lecture du premier caractere de la ligne
    					if(caractere == '$'){											//Ligne de commentaire
    puts("commentaire");
    						printf("Commentaire : %s",ligne);							//Affichage du commentaire
    					}
    					else{															//Il s'agit d'une ligne de données
    puts("donnees");
    						compteur = 0;												//Initialisation du compteur de caracteres
    						while (caractere != '#'){									//Vérification de non fin de données atteinte
    puts("lecture d'un caractère");
    								//printf("%c", caractere);										//Affichage du caractère
    								PushBack(listeDC,caractere);						//Ajout du caractère en dernière position de la liste
    								compteur++;
    								caractere = ligne[compteur];
    						}
    						if(caractere == '#'){										//Fin de données atteinte
    							finDonnees = 1;											//Mise à "vrai" de la variable "booleene"
    						}
    					}
    				}
    			}
    			else
    			{
    puts("pas lecture fichier");
    				if (feof(fichierDonnees))											//Fin de fichier detectee
    				{
    					puts("\nFin du fichier de donnees atteinte.");
    				}
    
    				if (ferror(fichierDonnees))											//Une erreur s'est produite
    				{
    					perror("donnees.txt");
    				}
    			}
    			
    			fclose (fichierDonnees);												//Fermeture du fichier de donnees
    puts("lecture liste");
    			View(*listeDC);															//Affichage de la liste doublement chainee
    puts("fin lecture liste");
    
    		////Fin du traitement des donnees////
    
    puts("finit");
    }
    Mais il ne rentre pas dans le While que dont la condition est en rouge.

    Si je remplace le code de façon "sale" par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    				while((fgets(ligne, sizeof ligne, fichierDonnees) != NULL)/* && (finDonnees = 0)*/)
    				{																	//Tant que l'on peut lire une ligne du fichier et que la variable "booleene" finDonnees est a faux
    					caractere = ligne[0];											//Lecture du premier caractere de la ligne
    					if(caractere == '$'){									//Ligne de commentaire
    						printf("Commentaire : %s",ligne);							//Affichage du commentaire
    					}
    					else{															//Il s'agit d'une ligne de données
    						compteur = 0;												//Initialisation du compteur de caracteres
    						while (caractere != '#'){									//Vérification de non fin de données atteinte
    								//printf("%c", caractere);									//Affichage du caractère
    								PushBack(listeDC,caractere);						//Ajout du caractère en dernière position de la liste
    								compteur++;
    								caractere = ligne[compteur];
    						}
    						if(caractere == '#'){										//Fin de données atteinte
    							//finDonnees = 1;											//Mise à "vrai" de la variable "booleene"
    							break;
    						}
    					}
    				}
    J'obtiens l'effet escompté mais je ne suis pas du tout satisfaite... Sortir d'une boucle par un break :s

    J'aurais voulu savoir comment faire pour améliorer ce code.

    Pour le code de la liste double, il s'agit de celui qui est dans les cours de developpez

    http://chgi.developpez.com/dblist/

    Avec quelques mineures modifications.

    Merci à vous,
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Bonjour,

    dej& pour faire un test
    ira beaucoup mieux que ton assignation

    pour le reste ca compile pas, si tu pouvais poster une version qui compile

  3. #3
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Par défaut


    c'est une erreur récurrente...

    Merci beaucoup.

    Sinon... Ca compile très bien ^^

    J'ai précisé que j'avais apporté quelques modifications quant aux fichiers du cour sur les doubles listes.

    les voici :
    dblist.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    #include <stdio.h>
    #include <stdlib.h>
     
     /*  Structure représantant un élément de la liste. */
     
            typedef struct
            {
                    char value;
                    struct elem *prev;
                    struct elem *next;
            }elem;
     
     /*  Structure d'accés à la liste. */
     
            typedef struct
            {
              elem *first;
              elem *last;
            }dblist;
     
    /******************************************************************************/
     
    void Init(dblist *l)
    {
       l->first = NULL;
       l->last = NULL;
    }
    /******************************************************************************/
     
    void PushBack(dblist *l, char val)
    {
       elem *nouv = malloc(sizeof(elem));
       if(!nouv) exit(1);
       nouv->value = val;
       nouv->prev = l->last;
       nouv->next = NULL;
       if(l->last) l->last->next = nouv;
       else l->first = nouv;
       l->last = nouv;        
    }
    /******************************************************************************/
     
    void PushFront(dblist *l, char val)
    {
       elem *nouv = malloc(sizeof(elem));
       if(!nouv) exit(1);
       nouv->value = val;
       nouv->next = l->first;
       nouv->prev = NULL;      
       if(l->first) l->first->prev = nouv;
       else l->last = nouv;
       l->first = nouv;
    }
    /******************************************************************************/
     
    char PopBack(dblist *l)
    {
       char val;
       elem *tmp = l->last;
       if(!tmp) return -1;
       val = tmp->value;
       l->last = tmp->prev;
       if(l->last) l->last->next = NULL;
       else l->first = NULL;
       free(tmp);
       return val;
    }
    /******************************************************************************/
     
    char PopFront(dblist *l)
    {
       char val;
       elem *tmp = l->first;
       if(!tmp) return -1;
       val = tmp->value;
       l->first = tmp->next;
       if(l->first)l->first->prev = NULL;
       else l->last = NULL;
       free(tmp);
       return val;
    }
    /******************************************************************************/
     
    void View(dblist l)
    {
       elem *pelem = l.first;
       while(pelem)
       {
         printf("%c ",pelem->value);
         pelem = pelem->next;
       }
    }
    /******************************************************************************/
     
    void Clear(dblist *l)
    {
       elem *tmp;
       elem *pelem = l->first;
       while(pelem)
       {
         tmp = pelem;
         pelem = pelem->next;
         free(tmp);
       }
       l->first = NULL;
       l->last = NULL;
    }
    dblist.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #define CGI_DBLIST_H
     
     /*  Initialisation de la liste. */
     
            void Init(dblist *l);
     
     /*  Ajout d'une valeur en fin de liste. */
     
            void PushBack(dblist *l, char val);
     
     /*  Ajout d'une valeur en début de liste. */
     
            void PushFront(dblist *l, char val);
     
     /*  Retrait d'une valeur en fin de liste. */
     
            char PopBack(dblist *l);
     
     /*  Retrait d'une valeur en début de liste. */
     
            char PopFront(dblist *l);
     
     /*  Affichage de toute la liste. */
     
            void View(dblist l);
     
     /*  Vidage de toute la liste. */
     
            void Clear(dblist *l);
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  4. #4
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    C'est bon du coup ca tourne ?
    C'etait l affectation a lieu du test qui donnait ca ?
    ([mode parle tout seul]c est bizarre je croyais qu une affectation renvoyait true quand ca marchait, et que du coup ca renvoyait toujours true, car y a peut de raison que ca rate... bizarre[/mode parle tout seul])

  5. #5
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Par défaut
    :s

    C'est vrai qu'une affectation de ce type retourne vrai...

    Hum... Oui ça marche mais ce n'est pas normal en fait ^^'

    Tant que affectation = vrai, il aurait du rentrer dans ma boucle vu qu'il lisait mon fichier...
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  6. #6
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Ouai je trouve ca etrange, peut etre que si l'un des fleuron du forum passe par la il pourra nous eclairer.

  7. #7
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par BainE
    ([mode parle tout seul]c est bizarre je croyais qu une affectation renvoyait true quand ca marchait, et que du coup ca renvoyait toujours true, car y a peut de raison que ca rate... bizarre[/mode parle tout seul])
    Citation Envoyé par Deallyra
    C'est vrai qu'une affectation de ce type retourne vrai...
    Non, l'expression prend la valeur de l'opérande la plus à gauche après affectation ( =,+=,*=, ... ) 0 dans ce cas donc false!

  8. #8
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Par défaut
    Merci SSmario pour cet éclaircissement
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Agir sur le texte entré dans un éditeur
    Par FatalError dans le forum C++
    Réponses: 1
    Dernier message: 24/10/2004, 14h54
  2. [CR8.5] Pbm d'affichage dans un While
    Par .:Tieri:. dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 14/07/2004, 10h17
  3. [VB6] suggestion des entrés dans un combobox
    Par s.rais dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 18/02/2004, 15h32
  4. touche entrée dans formulaire
    Par pram dans le forum XMLRAD
    Réponses: 8
    Dernier message: 15/04/2003, 09h13
  5. Réponses: 3
    Dernier message: 25/11/2002, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo