A voir également:
- Problème de lecture ds un fichier en c
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir un fichier .bin - Guide
- Impossible de supprimer un fichier - Guide
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
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
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)
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
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
Le code qui suit je l'ai testé sur
le code
quelque tests
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?
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
28 févr. 2008 à 03:45
Re,
dis-moi, ce n'est pas toi mimi_lindy ?
dis-moi, ce n'est pas toi mimi_lindy ?
28 févr. 2008 à 02:36
#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);
}