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 :

Modification d'un fichier (boucle infinie)


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 185
    Points
    185
    Par défaut Modification d'un fichier (boucle infinie)
    Bonjour les developpeurs.
    Alors voilà je suis pas une flèche en C et j'ai pas réussi à trouver les infos nécessaires pour résoudre mon problème donc je m'en remet à vous.

    Mon 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
    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define NMAX 20
    #define nomFichier "toto.dat"
     
    struct s_personne {
        char nom[NMAX];
        char prenom[NMAX];
        int age;
    };
     
    typedef struct s_personne personne;
     
    void saisiePersonnes(personne ** tbPersonnes, int * nbPersonnes) {
        char continuer;
        int i;
        personne tbPerso[30];
     
        *nbPersonnes = 0;
        printf("Saisie des infos de personnes (30 max)\n");
        do {
            printf("Personne %d\n", *nbPersonnes);
            printf("nom = "); scanf("%s", &(tbPerso[ *nbPersonnes ].nom));
            printf("prenom = "); scanf("%s", &(tbPerso[ *nbPersonnes ].prenom));
            printf("age = "); scanf("%d", &(tbPerso[ *nbPersonnes ].age));
            *nbPersonnes = *nbPersonnes + 1;
     
            printf("Autre personne (o/n) ? ");
            do {
                scanf("%c", &continuer);
            } while (continuer != 'o' && continuer != 'n');
        } while (continuer == 'o');
     
        if (*tbPersonnes = (personne *)malloc(*nbPersonnes * sizeof(personne))) {
            for (i=0; i < *nbPersonnes; i++) {
                 (*tbPersonnes)[i] = tbPerso[i];
            }
        } else
            printf("Problème d'allocation mémoire.\n");
     
    	printf("\n");
    }
     
    void creerFichierPersonnes (personne * tbPersonnes, int nbPersonnes) {
        FILE * fBin;
        if (fBin = fopen(nomFichier, "wb")) {
            fwrite(tbPersonnes, sizeof(personne), nbPersonnes, fBin);
            fclose(fBin);
        } else {
            printf("Impossible d'ouvrir le fichier %s en écriture.", nomFichier);
        }
    }
     
    void editerFichierPersonnes () {
    	char nomPerso[NMAX+1];
    	int tailleChaine, i;
    	FILE * fBin;
    	personne p;
     
    	// Initialisation du tableau
    	for (i=0; i <= NMAX; i++)
    		nomPerso[i] = '\0';
     
    	fflush(stdin);
    	printf("Entrez le nom de la personne pour laquelle vous voulez modifier les infos = \n");
    	fgets(nomPerso, NMAX+1, stdin);
     
    	// Si la chaine entrée est inférieure à NMAX caractères, on supprime le dernier \n
    	i = 0;
    	while (nomPerso[i]) {
    		if (nomPerso[i] == '\n')
    			nomPerso[i] = '\0';
    		i++;
    	}
     
    	if (fBin = fopen(nomFichier, "r+b")) {
            while (fread(&p, sizeof(personne), 1, fBin) > 0) {
    			printf("pos = %d\n", ftell(fBin));
    			if (!strcmp(p.nom, nomPerso)) {
    				printf("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
    				printf("Entrez un nouvel âge = ");
    				scanf("%d", &(p.age));
     
    				// Déplacement du pointeur du fichier à la fin de l'enregistrement précédent
    				fseek(fBin, -sizeof(personne), SEEK_CUR);
    				// Enregistre la structure modifiée dans le fichier
    				fwrite(&p, sizeof(personne), 1, fBin);
    			}
    		}
    		fclose(fBin);		
    	} else
            printf("Impossible d'ouvrir le fichier %s en lecture / écriture.", nomFichier);
    }
     
    void afficherPersonnes() {
        FILE * fBin;
        personne p;
        if (fBin = fopen(nomFichier, "rb")) {
            printf("Listing des personnes\n");
            while (fread(&p, sizeof(personne), 1, fBin) > 0)
                printf("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
            fclose(fBin);
    		printf("\n");
        } else {
            printf("Impossible d'ouvrir le fichier %s en lecture.", nomFichier);
        }
    }
     
    int main() {
        personne * tbPersonnes;
        int nbPersonnes;
     
        saisiePersonnes(&tbPersonnes, &nbPersonnes);
        creerFichierPersonnes(tbPersonnes, nbPersonnes);
        free(tbPersonnes);
     
        afficherPersonnes();
        editerFichierPersonnes();
    	afficherPersonnes();	
     
        return 0;
    }
    En fait c'est un exercice de td que j'arrive pas à faire fonctionner (sur le papier ça fonctionnait très bien pourtant ^^).
    Le but
    - Saisir des infos (nom, prenom, age) d'une liste de personnes
    - Creer le fichier binaire contenant cette liste de personnes
    - Lire ce fichier binaire
    - Demander un nom à l'utilisateur, le rechercher dans le fichier et pour chaque occurence trouvée demander un nouvel âge et faire la modification dans le fichier et c'est là que ça coince.

    Le code incriminé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            while (fread(&p, sizeof(personne), 1, fBin) > 0) {
    			printf("pos = %d\n", ftell(fBin));
    			if (!strcmp(p.nom, nomPerso)) {
    				printf("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
    				printf("Entrez un nouvel âge = ");
    				scanf("%d", &(p.age));
     
    				// Déplacement du pointeur du fichier à la fin de l'enregistrement précédent
    				fseek(fBin, -sizeof(personne), SEEK_CUR);
    				// Enregistre la structure modifiée dans le fichier
    				fwrite(&p, sizeof(personne), 1, fBin);
    			}
    		}
    En fait le programme ne s'arrête jamais, il me demande toujours d'entrer un nouvel âge comme si le fichier s'agrandissait ...

    PS: désolé d'avoir posté antant de code mais cela vous permettra de tester par vous-même (j'utilise dev-c++ sous windows xp)

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Modification d'un fichier (boucle infinie)
    Citation Envoyé par poof65
    Le code incriminé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            while (fread(&p, sizeof(personne), 1, fBin) > 0) {
    			printf("pos = %d\n", ftell(fBin));
    			if (!strcmp(p.nom, nomPerso)) {
    				printf("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
    				printf("Entrez un nouvel âge = ");
    				scanf("%d", &(p.age));
     
    				// Déplacement du pointeur du fichier à la fin de l'enregistrement précédent
    				fseek(fBin, -sizeof(personne), SEEK_CUR);
    				// Enregistre la structure modifiée dans le fichier
    				fwrite(&p, sizeof(personne), 1, fBin);
    			}
    		}
    En fait le programme ne s'arrête jamais, il me demande toujours d'entrer un nouvel âge comme si le fichier s'agrandissait ...

    PS: désolé d'avoir posté antant de code mais cela vous permettra de tester par vous-même (j'utilise dev-c++ sous windows xp)
    scanff() est difficile à utiliser correctement. Je conseille fgets() et le fonction de conversion qui va bien.

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers


    Premières remarques sur l'ensemble du code (non exhaustives).
    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define NMAX 20
    #define nomFichier "toto.dat"
     
    struct s_personne
    {
       char nom[NMAX];
       char prenom[NMAX];
       int age;
    };
     
    typedef struct s_personne personne;
     
    static void saisiePersonnes (personne ** tbPersonnes, int *nbPersonnes)
    {
       char continuer;
       int i;
       personne tbPerso[30];
     
       *nbPersonnes = 0;
       printf ("Saisie des infos de personnes (30 max)\n");
       do
       {
          printf ("Personne %d\n", *nbPersonnes);
          printf ("nom = ");
     
    /* -ed- ce & est en trop.
     
       scanf ("%s", &(tbPerso[*nbPersonnes].nom));
     */
          scanf ("%s", tbPerso[*nbPersonnes].nom);
     
          printf ("prenom = ");
          scanf ("%s", tbPerso[*nbPersonnes].prenom);
     
          printf ("age = ");
          scanf ("%d", &(tbPerso[*nbPersonnes].age));
     
          *nbPersonnes = *nbPersonnes + 1;
     
          printf ("Autre personne (o/n) ? ");
          do
          {
             scanf ("%c", &continuer);
          }
          while (continuer != 'o' && continuer != 'n');
       }
       while (continuer == 'o');
     
    /* -ed- syntaxe peu claire et trop compliquee...
     
       if (*tbPersonnes = (personne *) malloc (*nbPersonnes * sizeof (personne)))
     
       Ces pointeurs me fatiguent. Il aurait ete nettement plus simple
       de retourner l'adresse du bloc alloue' (ou NULL) ou encore mieux,
       de travailler avec une structure {adresse, taille}.
     
       De plus, la structure du code est etrange. Pourquoi limiter a 30 d'un
       cote et utiliser la memoire dynamique de l'autre. Il est plus
       'intelligent' de tout faire en dynamique, soit par liste chainee,
       soit par tableau souple.
     
     */
       *tbPersonnes = malloc (*nbPersonnes * sizeof **tbPersonnes);
     
       if (*tbPersonnes != NULL)
       {
          for (i = 0; i < *nbPersonnes; i++)
          {
             (*tbPersonnes)[i] = tbPerso[i];
          }
       }
       else
       {
          printf ("Problème d'allocation mémoire.\n");
       }
       printf ("\n");
    }
     
    /* -ed-
       le bon type pour les tailles d'objets, index et autres nombre
       d'objets est size_t
       static void creerFichierPersonnes (personne * tbPersonnes, int nbPersonnes)
     */
    static void creerFichierPersonnes (personne * tbPersonnes, size_t nbPersonnes)
    {
       FILE *fBin = fopen (nomFichier, "wb");
     
       if (fBin != NULL)
       {
          fwrite (tbPersonnes, sizeof (personne), nbPersonnes, fBin);
          fclose (fBin);
       }
       else
       {
          printf ("Impossible d'ouvrir le fichier %s en écriture.", nomFichier);
       }
    }
     
    static void editerFichierPersonnes (void)
    {
       char nomPerso[NMAX + 1];
     
       /* -ed- tailleChaine non utilisee... */
       int tailleChaine, i;
       FILE *fBin;
       personne p;
     
       /* Initialisation du tableau */
       for (i = 0; i <= NMAX; i++)
       {
          nomPerso[i] = '\0';
       }
     
    /* -ed-
       Comportement indefini. (aka bug)
       fflush() est defini uniquement pour les flux sortants.
     */
       fflush (stdin);
       printf ("Entrez le nom de la personne pour laquelle vous voulez modifier les infos = \n");
       fgets (nomPerso, NMAX + 1, stdin);
     
       /* Si la chaine entrée est inférieure à NMAX caractères, on supprime le dernier \n */
       i = 0;
       while (nomPerso[i])
       {
          if (nomPerso[i] == '\n')
             nomPerso[i] = '\0';
          i++;
       }
     
       /* -ed- r+b ! Ca fout la trouille ! */
       fBin = fopen (nomFichier, "r+b");
     
       if (fBin != NULL)
       {
          while (fread (&p, sizeof (personne), 1, fBin) > 0)
          {
     
    /* -ed-
       format errone. ftell() retourne un long.
     
       printf ("pos = %d\n", ftell (fBin));
     */
             printf ("pos = %ld\n", ftell (fBin));
     
             if (!strcmp (p.nom, nomPerso))
             {
                printf ("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
                printf ("Entrez un nouvel âge = ");
                scanf ("%d", &(p.age));
     
                /* Déplacement du pointeur du fichier à la fin de l'enregistrement précédent */
               fseek (fBin, -sizeof (personne), SEEK_CUR);
     
                /* Enregistre la structure modifiée dans le fichier */
                fwrite (&p, sizeof (personne), 1, fBin);
             }
          }
          fclose (fBin);
       }
       else
       {
          printf ("Impossible d'ouvrir le fichier %s en lecture / écriture.", nomFichier);
       }
    }
     
    static void afficherPersonnes (void)
    {
       FILE *fBin = fopen (nomFichier, "rb");
     
       if (fBin != NULL)
       {
          personne p;
     
          printf ("Listing des personnes\n");
     
          while (fread (&p, sizeof (personne), 1, fBin) > 0)
          {
             printf ("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
          }
          fclose (fBin);
          printf ("\n");
       }
       else
       {
          printf ("Impossible d'ouvrir le fichier %s en lecture.", nomFichier);
       }
    }
     
    int main (void)
    {
       personne *tbPersonnes;
       size_t nbPersonnes;
     
       saisiePersonnes (&tbPersonnes, &nbPersonnes);
       creerFichierPersonnes (tbPersonnes, nbPersonnes);
       free (tbPersonnes);
     
       afficherPersonnes ();
       editerFichierPersonnes ();
       afficherPersonnes ();
     
       return 0;
    }
    EDIT : suppression de la remarque sur fseek(). M'apprendras à ne pas vérifier. Hou la honte!

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    /* -ed-
    Comportement indefini. (aka bug)
    fflush() est defini uniquement pour les flux sortants.
    */
    Ça, c'est un vrai fléau, surtout qu'on nous apprend en cours que ça marche...
    EDIT: En fait, je viens de consulter MSDN, ça marche officiellement sur les OS microsoft.
    Citation Envoyé par MSDN
    If the file associated with stream is open for output, fflush writes to that file the contents of the buffer associated with the stream. If the stream is open for input, fflush clears the contents of the buffer.
    Enfin après, on va dire qu'ils ne sont pas standard...

    ATTENTION la valeur de deplacement est non signee, ce qui laisse supposer
    qu'un deplacement ne peut etre que positif (vers l'avant).
    Je viens de regarder dans MSDN, et dans man fseek (HP-UX) : les deux définissent le paramètre soit comme un long, soit comme un off_t (typedef long off_t). J'ai vu également dans une doc un type ssize_t (signed size_t) qui était utilisé pour cela...
    Donc, visiblement fseek prend une valeur signée, donc il ne doit pas y avoir de problème...

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc
    ATTENTION la valeur de deplacement est non signee, ce qui laisse supposer
    qu'un deplacement ne peut etre que positif (vers l'avant).
    Je viens de regarder dans MSDN, et dans man fseek (HP-UX) : les deux définissent le paramètre soit comme un long, soit comme un off_t (typedef long off_t). J'ai vu également dans une doc un type ssize_t (signed size_t) qui était utilisé pour cela...
    Donc, visiblement fseek prend une valeur signée, donc il ne doit pas y avoir de problème...
    Oui, erreur. Je corrige.

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 185
    Points
    185
    Par défaut
    Merci pour tous ces conseils.

    /* -ed- r+b ! Ca fout la trouille ! */
    Je comprends pas cette remarque, c'est pourtant ce que j'ai appris en cours.

    De plus, la structure du code est etrange. Pourquoi limiter a 30 d'un
    cote et utiliser la memoire dynamique de l'autre. Il est plus
    'intelligent' de tout faire en dynamique, soit par liste chainee,
    soit par tableau souple.
    Pour le coup de la memoire dynamique limité à 30, j'avoue j'ai été fainéant sur ce coup là, j'avais pas envie d'ecrire les primitives pour listes chainées pour un simple exercice de td.

    J'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(fBin, -sizeof(personne), SEEK_CUR);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(fBin, ftell(fBin) - sizeof(personne), SEEK_SET);
    mais j'ai toujours le même problème.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par poof65
    /* -ed- r+b ! Ca fout la trouille ! */
    Je comprends pas cette remarque, c'est pourtant ce que j'ai appris en cours.
    Il n'empêche que "ça fout la trouille" quand même! En général, ce genre de manip se termine par la destrcution du fichier de 200 Mo contenant les informations vitales du projet, par exemple, et ce, le jour de la démo devant le grand patron...).

    On préfère travailler avec 2 fichiers, ou alors avec un fichier d'index et ne jamais toucher au fichier de données (si ce n'est pour ajouter à la fin : mode "a" ou "ab").

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    C'est vrai, le r+ (ou O_RDWR pour les adeptes du bas-niveau) est assez rarement utilisé, car risqué.
    Je rejoins Emmanuel là-dessus, deux fichiers sont préférables.

  8. #8
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 185
    Points
    185
    Par défaut
    Oui mais là c'est juste un exercice et sur des données temporaires alors j'aimerais y arriver quand même.

    Alors voilà j'ai fait tout plein de tests et j'ai "résolu" le problème en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(fBin, 0L, SEEK_CUR);
    dans la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    			if (!strcmp(p.nom, nomPerso)) {
    				printf("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
    				printf("Entrez un nouvel âge = ");
    				scanf("%d", &(p.age));
     
    				// Déplacement du pointeur du fichier à la fin de l'enregistrement précédent
    				fseek(fBin, -sizeof(personne), SEEK_CUR);
    				// Enregistre la structure modifiée dans le fichier
    				fwrite(&p, sizeof(personne), 1, fBin);
    				fseek(fBin, 0L, SEEK_CUR);
    			}
    mais je ne comprends vraiment pas pourquoi ça fonctionne comme ça.
    J'ai testé (avec ftell) et je vérifie bien que le fwrite implique le décalage de la "tête de lecture" d'un cran, là c'est bon. Mais sans le dernier fseek, le fread suivant lit l'enregistrement précédent de telle sorte que l'enregistrement p est toujours le même et vérifie donc toujours la condition ce qui implique la boucle infinie.

    Avez-vous une explication à ce phenomène étrange ?

  9. #9
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 185
    Points
    185
    Par défaut
    Bon allez je met résolu mais si vous avez une idée sur la cause du problème, n'hésitez pas.

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

Discussions similaires

  1. Boucle infinie de fichiers
    Par Fabien.31 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 01/05/2012, 18h03
  2. [WD12E] boucle infinie - lecture fichier
    Par nagadscar dans le forum WinDev
    Réponses: 7
    Dernier message: 12/07/2010, 12h20
  3. Boucle infinie qui va lire dans un fichier et afficher les dernières lignes
    Par ApocKalipsS dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/05/2010, 18h27
  4. boucle infinie au lancement du fichier
    Par geraldh713 dans le forum Access
    Réponses: 2
    Dernier message: 15/08/2007, 16h35
  5. Réponses: 16
    Dernier message: 03/11/2005, 19h33

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