Problème de lecture ds un fichier en c

Fermé
majdolina - 28 févr. 2008 à 02:13
 majdolina - 28 févr. 2008 à 22:38
Bonjour, j'ai créé un programme où on gère les stagiaire(nom,prenom,age) j'ai mit l'écriture d'un fichier et la lecture de celui-ci et aussi l'ajout ,mais j'ai un problème de lecture quand j'ajoute un autre stagiaire j'arrive pas à le lire même si j'ai mit lors de l'ajout:
f=fopen("c:\\gestionstagiaire","a");quelqu'un peut m'aider?
A voir également:

3 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
28 févr. 2008 à 02:27
Salut,

le mode "a" te permet d'ouvrir le fichier en mode ajout

mode ajout - les données sont ajouter à la fin de fichier. Tout tentative de lecture provoque une erreur

donc tu dois fermer le fichier après l'ajout
fclose(f);
et ensuite ouvrire le fichier en mode lecture "r"
f=fopen("c:\\gestionstagiaire","r");
Une autre possiblité c'est de l'ouvrir depuis le début avec le mode "a+" (lecture-écriture)
0
mais c'est ce que j'ai fait et il y a toujours le même problème stp pourrait tu tester mon programme et me dire où j dois corriger?

#include<stdio.h>
void ecrire(struct stagiaire*);
void afficher(FILE*);
void menu(int*);

struct stagiaire{
char nom[20];
char prenom[20];
int code;
int etat;
}stg;
void main()
{
FILE* f;
int choix;

do{
menu(&choix);
switch(choix)
{ case 1:{ f=fopen("c:\\gestionstagiaire","wb");


if(!ferror(f)){
ecrire(&stg);
fwrite(&stg,sizeof(stg),1,f);
}
else
puts("erreur d'ouverture de fichier");
fclose(f);
}
break;
case 2: afficher(f);
break;
case 3:{ f=fopen("c:\\gestionstagiaire","a");
if(!ferror(f)){
ecrire(&stg);
fwrite(&stg,sizeof(stg),1,f);
}
else
puts("erreur d'ouverture de fichier");
fclose(f);


}
break;
case 4: printf("Vous allez quitter le programme...");
break;
} }
while(choix!=4);
getchar();
}




void ecrire(struct stagiaire* stg)
{
printf("Entrez le nom du stagiaire:\n");
fflush(stdin);
scanf("%s",&(*stg).nom);
printf("Entrez le prenom du stagiaire:\n");
fflush(stdin);
scanf("%s",&(*stg).prenom);
printf("Entrez le code du stagiaire:\n");
fflush(stdin);
scanf("%d",&(*stg).code);
(*stg).etat=1;
}
void menu(int* choix)
{

printf("Pour ecrire un stagiaire tapez 1\n");
printf("Pour afficher un stagiaire tapez 2\n");
printf("Pour ajouter un autre stagiaire tapez 3\n");
printf("Pour quitter le programme tapez 4\n");
printf("Quel est votre choix?\n");
scanf("%d",choix);
}
void afficher(FILE* f)
{int c;
f=fopen("c:\\gestionstagiaire","rb");
if(f!=NULL){
printf("Entrez le code du stagiaire:\n");
fflush(stdin);
scanf("%d",&c);
do
{fread(&stg,sizeof(stg),1,f);
if(stg.code==c){
printf("NOM: %s\n",stg.nom);
printf("PRENOM: %s\n",stg.prenom);
printf("CODE: %d\n",stg.code);}
else
printf("Vous vous etes tromper de code\n"); }
while((!feof(f))&&(stg.etat!=1)); }
else
printf("Erreur d'ouverture de fichier");
fclose(f);
}
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
28 févr. 2008 à 03:38
Salut,

tout d'abord j'a modifé un peu la fonction pour afficher
tu as declarer les prototypes avant la structure que tu la passes en paramètres et j'ai eu une erreur de compilation
fflush(stdin) je l'ai supprimé
fflush() n'a effet que sur les flux en écriture. Donc fflush(stdin) n'a aucune utilité
la fonction affiche retournera une valeur int ce qui permettra d'afficher le message en cas d'erreur de code
la boucle while de la fonction affiche s'exécute tant que je peux lire avec fread (si fread arrive à la fin de fichier la boucle s'arrête puisque fread n'a plus de donné à lire)

le retour d'erreur de code ne peux pas se faire dans la boucle while comme tu as essayé pour la simple raison que le fichier est parcouru jusqu'à la fin, et même si en premier temps fread ne trouvera l'enregistrement il le trouvera peut être après et vice versa même si en premier temps il le trouve comme fread lit jusqu'à la fin le test d'égalité ne sera plus vrai

scanf("%s",&(*stg).nom);

pas besoin de & vu que nom c'est une chaîne de caractère

donc tu peux écrire
scanf("%s",(*stg).nom);
ou encore en utlisant l'opérateur ->
scanf("%s",stg->nom); 
Peut être tu dois penser faire une comparaison pour que le code de chaque stagiaire soit unique.

Le code qui suit je l'ai testé sur
lami20j@debian:~/trash$ uname -a && gcc --version
Linux debian 2.6.22.7 #1 SMP Mon Sep 24 16:17:22 CEST 2007 i686 GNU/Linux
gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

le code
#include<stdio.h>


struct stagiaire
{
  char nom[20];
  char prenom[20];
  int code;
  int etat;
} stg;

void ecrire (struct stagiaire *);
int afficher (FILE *);
void menu (int *);

int main ()
{
  FILE *f;
  int choix, i;

  do {
    menu (&choix);
    switch (choix) {
    case 1:{
        f = fopen ("c:\\gestionstagiaire", "wb");
        if (!ferror (f)) {
          ecrire (&stg);
          fwrite (&stg, sizeof (stg), 1, f);
        }
        else
          puts ("erreur d'ouverture de fichier");
        fclose (f);
      }
      break;
    case 2:
      if (i = afficher (f))
        printf ("Vous vous etes tromper de code\n");
      break;
    case 3:{
        f = fopen ("c:\\gestionstagiaire", "a");
        if (!ferror (f)) {
          ecrire (&stg);
          fwrite (&stg, sizeof (stg), 1, f);
        }
        else
          puts ("erreur d'ouverture de fichier");
        fclose (f);
      }
      break;
    case 4:
      printf ("Vous allez quitter le programme...");
      break;
    }
  }
  while (choix != 4);
  getchar ();
  return 0;
}

/* FONCTIONS */

/*ecrire */
void ecrire (struct stagiaire *stg)
{
  printf ("Entrez le nom du stagiaire:\n");
  scanf ("%s", (*stg).nom);
  printf ("Entrez le prenom du stagiaire:\n");
  scanf ("%s", (*stg).prenom);
  printf ("Entrez le code du stagiaire:\n");
  scanf ("%d", &(*stg).code);
  (*stg).etat = 1;
}

/*menu */
void menu (int *choix)
{

  printf ("Pour ecrire un stagiaire tapez 1\n");
  printf ("Pour afficher un stagiaire tapez 2\n");
  printf ("Pour ajouter un autre stagiaire tapez 3\n");
  printf ("Pour quitter le programme tapez 4\n");
  printf ("Quel est votre choix?\n");
  scanf ("%d", choix);
}

/*afficher */
int afficher (FILE * f)
{
  int c;

  f = fopen ("c:\\gestionstagiaire", "rb");
  if (f == NULL)
    printf ("Erreur d'ouverture de fichier");

  printf ("Entrez le code du stagiaire:\n");
  scanf ("%d", &c);
  while (fread (&stg, sizeof (stg), 1, f) || (stg.etat != 1)) {
    if (stg.code == c) {
      printf ("NOM: %s\n", stg.nom);
      printf ("PRENOM: %s\n", stg.prenom);
      printf ("CODE: %d\n", stg.code);
      fclose (f);
      return 0;
    }
  }
  return 1;
}

quelque tests
lami20j@debian:~/trash$ ./a.out
Pour ecrire un stagiaire tapez 1
Pour afficher un stagiaire tapez 2
Pour ajouter un autre stagiaire tapez 3
Pour quitter le programme tapez 4
Quel est votre choix?
1
Entrez le nom du stagiaire:
majdolina
Entrez le prenom du stagiaire:
lina
Entrez le code du stagiaire:
10
Pour ecrire un stagiaire tapez 1
Pour afficher un stagiaire tapez 2
Pour ajouter un autre stagiaire tapez 3
Pour quitter le programme tapez 4
Quel est votre choix?
3
Entrez le nom du stagiaire:
lami20j
Entrez le prenom du stagiaire:
lam
Entrez le code du stagiaire:
100
Pour ecrire un stagiaire tapez 1
Pour afficher un stagiaire tapez 2
Pour ajouter un autre stagiaire tapez 3
Pour quitter le programme tapez 4
Quel est votre choix?
2
Entrez le code du stagiaire:
10
NOM: majdolina
PRENOM: lina
CODE: 10
Pour ecrire un stagiaire tapez 1
Pour afficher un stagiaire tapez 2
Pour ajouter un autre stagiaire tapez 3
Pour quitter le programme tapez 4
Quel est votre choix?
2
Entrez le code du stagiaire:
100
NOM: lami20j
PRENOM: lam
CODE: 100
Pour ecrire un stagiaire tapez 1
Pour afficher un stagiaire tapez 2
Pour ajouter un autre stagiaire tapez 3
Pour quitter le programme tapez 4
Quel est votre choix?
2
Entrez le code du stagiaire:
50
Vous vous etes tromper de code
Pour ecrire un stagiaire tapez 1
Pour afficher un stagiaire tapez 2
Pour ajouter un autre stagiaire tapez 3
Pour quitter le programme tapez 4
Quel est votre choix?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
28 févr. 2008 à 03:45
Re,

dis-moi, ce n'est pas toi mimi_lindy ?
0
d'abord merci beaucoup vraiment j'étais coincée,c pas moi mimi lindy :D
0
majdolina > majdolina
28 févr. 2008 à 22:38
stp j'ai pas compris pourquoi tu as mis return 0 et return 1 ?
0