Exercice manipulation de fichier
Résolu/Fermé
Utilisateur anonyme
-
27 juin 2015 à 13:26
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 30 juin 2015 à 17:12
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 30 juin 2015 à 17:12
A voir également:
- Exercice manipulation de fichier
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier host - Guide
- Ouvrir fichier .bin - Guide
6 réponses
Utilisateur anonyme
27 juin 2015 à 13:41
27 juin 2015 à 13:41
j'ai essaye mais c'etait un peu long je me suis dis que j'aurai un algorithme plus court pour resoudre ce problème
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
27 juin 2015 à 14:22
27 juin 2015 à 14:22
Bonjour,
Mes remarques sur ton code :
#include<conio.h>
Non standard, à éviter.
main()
Le bon prototype est
Et donc, il ne faut pas oublier
NOM_FICHIER[30]
FILE *FICHIER ;
Usuellement, les variables ne sont pas en lettres capitales. On réserve ça pour les constantes.
for ( i=0 ;i<1;i++)
C'est quoi l'intérêt d'une boucle à 1 itération ?
fscanf(FICHIER, "%d\n%s\n%s\n", &matricule, nom, prenom,sexe);
Ca ne marchera pas le \n. Fais-le en plusieurs fois.
getch();
Non portable. Utilise plutôt : getchar(); à la place. Je te conseille même de mettre un double getchar(); ou alors n'oublie pas de vider le buffer clavier.
Ensuite, mes remarques par rapport à ton exercice :
Le plus simple aurait été de créer une structure et décrire la structure en une fois dans le fichier.
Ensuite, il faut faire des fonctions. Ca facilite la maintenance et aide à la relecture.
Je te conseille d'abord de réfléchir à la conception avant de te plonger dans le code. Typiquement, dis-nous en français (en algorithmique) comment cela doit fonctionner.
Cdlt,
Mes remarques sur ton code :
#include<conio.h>
Non standard, à éviter.
main()
Le bon prototype est
int main(void)
Et donc, il ne faut pas oublier
return 0;en fin de main() pour signaler que tout s'est bien déroulé.
NOM_FICHIER[30]
FILE *FICHIER ;
Usuellement, les variables ne sont pas en lettres capitales. On réserve ça pour les constantes.
for ( i=0 ;i<1;i++)
C'est quoi l'intérêt d'une boucle à 1 itération ?
fscanf(FICHIER, "%d\n%s\n%s\n", &matricule, nom, prenom,sexe);
Ca ne marchera pas le \n. Fais-le en plusieurs fois.
getch();
Non portable. Utilise plutôt : getchar(); à la place. Je te conseille même de mettre un double getchar(); ou alors n'oublie pas de vider le buffer clavier.
Ensuite, mes remarques par rapport à ton exercice :
Le plus simple aurait été de créer une structure et décrire la structure en une fois dans le fichier.
Ensuite, il faut faire des fonctions. Ca facilite la maintenance et aide à la relecture.
Je te conseille d'abord de réfléchir à la conception avant de te plonger dans le code. Typiquement, dis-nous en français (en algorithmique) comment cela doit fonctionner.
Cdlt,
#include<stdio.h>
#include<conio.h>
/*fonction pour afficher les info du fichier */
void afficherInfo(FILE*fichier)
{
int matricule;
char nom[30];
char prenom[30];
char sexe[30];
char DateDeNaissance[10];
while(fscanf(fichier,"%d\n%s\n%s\n%s\n%d\n",&matricule,nom,prenom,sexe,DateDeNaissance)>0)
{
printf("matricule: %d\n , matricule");
printf("Nom et prenom:,%s %s\n",nom,prenom);
printf("sexe: %s\n",sexe);
}
}
/* fonction pour gestion du menu */
int menu()
{
int choix = 0;
while (choix < 1 || choix > 5)
{
printf("Menu :\n");
printf("1 : ajouter un employe ");
printf("2 : afficher tous les enregistrements \n");
printf("3 : consulter l'information sur un employe \n");
printf("4 : modification des donnees d'un employe '\n");
printf("% : suppression des donnees d'un employe ");
scanf("%d", &choix);
}
return choix;
}
/* fonction pour ajouter un employe au fichier */
void ajoutemploye()
/* fonction supprimer un employe */
/*modification d'un employe a partir du matricule */
void modification (int choisir)
{
do
{
printf("---------------");
printf("1.nom");
printf("2.prenom");
printf("3.sexe");
printf("4.matricule");
printf("5.date de naissance");
printf("-----------------");
scanf("%d",choisir);
}
while(choisir<1 || choisir >4)
}
un peu comme ceci mais je n'arrive pas à concevoir la fonction pour supprimer une donnee avec le matricule
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
Utilisateur anonyme
28 juin 2015 à 13:56
28 juin 2015 à 13:56
Bonjour,
Tu n'as pas pris en compte toutes mes remarques...
Je te laisse donc les relire (par exemple : fscanf()...)
Pour modifier un fichier, il faut passer par un fichier temporaire. Tu crées un fichier temporaire, tu recopies toutes les données exceptées celles que tu souhaites supprimer. Ensuite il ne te reste plus qu'à renommer le fichier.
Note : lorsque tu postes ton code, utilise plutôt la balise <code c>
Exemple : <code c>ici tu mets ton code</code>
Tu n'as pas pris en compte toutes mes remarques...
Je te laisse donc les relire (par exemple : fscanf()...)
Pour modifier un fichier, il faut passer par un fichier temporaire. Tu crées un fichier temporaire, tu recopies toutes les données exceptées celles que tu souhaites supprimer. Ensuite il ne te reste plus qu'à renommer le fichier.
Note : lorsque tu postes ton code, utilise plutôt la balise <code c>
Exemple : <code c>ici tu mets ton code</code>
Utilisateur anonyme
28 juin 2015 à 19:06
28 juin 2015 à 19:06
#include<stdio.h> #include <stdlib.h> /*structure utilise*/ struct employe { int matricule; char nom[50]; char prenom [50]; char sexe[2]; char nomfichier[30]; } ; /*fonction pour afficher les informations*/ void afficherInfo(FILE*fichier) { employe E; while(fscanf(fichier,"%d\n%s\n%s\n%s\n%d\n",&E.matricule,E.nom,E.prenom,E.sexe)>0) { printf("matricule: %d\n ",E.matricule); printf("Nom et prenom:,%s %s\n",E.nom,E.sexe); printf("sexe: %s\n",E.sexe); } } /*fonction pour ajouter des donnees aux fichiers */ void ajout(FILE*fichier) { char nomfichier[30]; employe E; fichier=fopen(nomfichier,"w"); printf("saississez le numero matricule"); scanf("%d",E.matricule); printf("nom :"); scanf("%s",E.prenom); printf("sexe :"); scanf("%s",E.sexe); fprintf(fichier, "%d %s %s %s \n",E.matricule,&E.nom,&E.prenom,&E.sexe); fclose(fichier); } /*fonction pour supprimer une donnee */ /*programme principal*/ main() { employe E; int i,n; char nomfichier[30]; FILE *fichier ; printf("Entrez le nom du fichier :\n "); scanf("%s", nomfichier); fichier=fopen(nomfichier,"w"); for ( i=0 ;i<4;i++) { printf("employe Numero %d \n ",i+1); printf("entrez votre matricule SVP \n"); scanf("%d", E.matricule); printf("entrez votre nom SVP \n"); scanf("%s", & E.nom); printf("entrez votre prenom svp\n"); scanf("%s", &E.prenom); printf("sexe M/F \n"); scanf("%s", &E.sexe); fprintf(fichier, "%d %s %s %s \n",E.matricule,&E.nom,&E.prenom,&E.sexe); }/*fermetture du fichier */ fclose(fichier); printf("------------menu--------------------------------------\n"); printf("1-ajouter un employe a la liste \n"); printf("2-affichage de tous les enregistrements de ce fichier \n"); printf("3-modification des informations d'un employe' \n"); printf("4-consultation a partir du matricule "); printf("5-supprimer une info grace a son matricule \n"); printf("------------------------------------------------------\n"); scanf("%d",&n); switch(n) { case 1: break; case 2: break; case 3: break; case 4: printf(""); break; } return 0; }
voici , j'ai essaye de le faire , peux tu jetter un coup d'oeil
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
28 juin 2015 à 19:29
28 juin 2015 à 19:29
Il y a du mieux et du moins bien ;-).
fscanf(...);
Tu ne l'as toujours pas corrigé...
scanf("%d", E.matricule);
Il manque le &
scanf("%s", &E.prenom);
Le & est en trop.
=> A corriger pour tous les scanf().
Vu que maintenant, tu utilises une structure. Pour écrire, c'est beaucoup plus simple. Il te suffit de faire un fwrite() de la structure. De même pour la lecture, un simple fread() suffira.
Mais par delà le code, dis-nous fonctionnellement comment tu comptes t'y prendre pour lire les données ? Tableau de structure ? Etc.
fscanf(...);
Tu ne l'as toujours pas corrigé...
scanf("%d", E.matricule);
Il manque le &
scanf("%s", &E.prenom);
Le & est en trop.
=> A corriger pour tous les scanf().
Vu que maintenant, tu utilises une structure. Pour écrire, c'est beaucoup plus simple. Il te suffit de faire un fwrite() de la structure. De même pour la lecture, un simple fread() suffira.
Mais par delà le code, dis-nous fonctionnellement comment tu comptes t'y prendre pour lire les données ? Tableau de structure ? Etc.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
28 juin 2015 à 19:37
28 juin 2015 à 19:37
Ok, mais il faut développer... Ce que je te demande si tu préfères, c'est que tu traduises la lecture algorithmiquement :
Cela te permettra d'y voir plus clair. Ensuite, tu pourras le traduire en C.
tab : tableau de structure de taille ?
Pour chaque ligne du fichier
Lire ...
...
Cela te permettra d'y voir plus clair. Ensuite, tu pourras le traduire en C.
Utilisateur anonyme
28 juin 2015 à 19:35
28 juin 2015 à 19:35
il y a un une question que j'ai saute dans l'enonce , c'est permettre à l'utilisateur de modifier le contenu d'un employe . je pense d'abord en premier faire un deuxieme menu permettant de choisir si je veux modifier soit le matricule soit le nom soit le prenom ou soit ... et pour la fonction modification .... je dois encore y reflechir .
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
28 juin 2015 à 19:50
28 juin 2015 à 19:50
C'est la partie la plus dure.
Grosso modo, au lancement du programme, il doit lire le fichier et tout charger en mémoire.
Lors de la création, il suffit de créer une ligne à ton tableau de structure.
Pour la modification, il suffit de rechercher la structure correspondante (pour cela, il suffit de faire une boucle for) et de modifier les champs.
Et à la fin du programme, tu écries ton tableau dans un fichier temporaire que tu renommes pour qu'il remplace le fichier courant.
Et voilà :-). Je te laisse réfléchir à tout ça.
Grosso modo, au lancement du programme, il doit lire le fichier et tout charger en mémoire.
Lors de la création, il suffit de créer une ligne à ton tableau de structure.
Pour la modification, il suffit de rechercher la structure correspondante (pour cela, il suffit de faire une boucle for) et de modifier les champs.
Et à la fin du programme, tu écries ton tableau dans un fichier temporaire que tu renommes pour qu'il remplace le fichier courant.
Et voilà :-). Je te laisse réfléchir à tout ça.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
28 juin 2015 à 20:04
28 juin 2015 à 20:04
Non. Il reste des erreurs de code que je t'ai signalées. Après conceptuellement, ce n'est pas faux mais ton implémentation (écriture dans le fichier systématiquement) va te compliquer la tâche. C'est pour ça que je te recommande vraiment de travailler d'abord sur la conception (algorithme), puis après il ne te restera plus qu'à traduire l'algorithme.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
29 juin 2015 à 21:07
29 juin 2015 à 21:07
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <windows.h> /*programme principal */ main() { FILE *fp , *ft; char autrechoix, choix , nomfichier[30]; int i ; /*structure de l'employe*/ struct emp{ int matricule; char nom[40]; char prenom[40]; char sexe [1]; int datenai ; }; /*structure */ struct emp e; /*variable pour enregistrer le matricule des employes*/ char empmatricule[40]; /*taille de chaque enregistrement */ long int recsize; /*creation du fichier */ fp = fopen("EMP.DAT","rb+"); if(fp == NULL) { fp = fopen("EMP.DAT","wb+"); if(fp == NULL) { printf("Impossible d'ouvrir le fichier"); exit(1); } } /*taille de chaque enregistrement exemple pour la structure e */ recsize = sizeof(e); /*creer le fichier a remplir*/ fseek(fp,0,SEEK_END); for (i=0;i<4;i++) { printf("----employe #%d--------- \n",i+1); printf("entrez le numero de matricule SVP\n"); scanf("%d",&e.matricule); printf("entrez le nom \n"); scanf("%s",e.nom); printf("entrez le prenom\n"); scanf("%s",e.prenom); printf("sexe :M/F\n"); scanf("%s",e.sexe); printf("votre date de naissance (JJ/MM/AAAA)\n"); scanf("%d",&e.datenai); fwrite(&e,recsize,1,fp); } printf("|-----Bienvenue au Menu de Gestion---------------------|\n"); printf("|1-ajouter un employe a la liste |\n"); printf("|2-affichage de tous les enregistrements de ce fichier |\n"); printf("|3-modification des informations d'un employe' |\n"); printf("|4-consultation a partir du matricule |\n"); printf("|5-supprimer une info grace a son matricule |\n"); printf("|------------------------------------------------------|\n"); fflush(stdin); choix = getche(); switch(choix) { case '1': autrechoix = 'y'; fseek(fp,0,SEEK_END); while(autrechoix == 'y') { printf("----nouveau employe--------- \n"); printf("entrez le numero de matricule SVP\n"); scanf("%d",&e.matricule); printf("entrez le nom \n"); scanf("%s",e.nom); printf("entrez le prenom\n"); scanf("%s",e.prenom); printf("sexe :M/F\n"); scanf("%s",e.sexe); printf("votre date de naissance (JJ/MM/AAAA)\n"); scanf("%d",&e.datenai); fwrite(&e,recsize,1,fp); printf("\n un autre enregistrement ? (y/n) "); fflush(stdin); autrechoix = getche(); } break; case '2': rewind(fp); while(fread(&e,recsize,1,fp)==1) { printf("\n %d %s %s %s %d",e.matricule,e.nom,e.prenom,e.sexe,e.datenai); } getch(); break; case '3': autrechoix = 'y'; while(autrechoix == 'y') { printf("Entrer le numero de matricule de l'employe:"); scanf("%s", empmatricule); rewind(fp); while(fread(&e,recsize,1,fp)==1) { /*comparaison des donnees */ if(strcmp(e.nom,empmatricule) == 0) { /* si le matricle correspond */ printf("\n re-entrer a nouveau les information : "); scanf("%d %s %s %s %d",&e.matricule,e.nom,e.prenom,e.sexe,&e.datenai); fseek(fp,-recsize,SEEK_CUR); /*changer la position du curseur */ fwrite(&e,recsize,1,fp); /*ecraser l'enregistrement*/ break; } } printf("\n modifier d'autres donnees ? (y/n)"); fflush(stdin); autrechoix = getche(); } break; case '4': autrechoix = 'y'; while(autrechoix == 'y') { printf("\nEntrez le numero de matricule de l'employe a supprime: "); scanf("%s",empmatricule); /*creation d'un fichier temporaire*/ ft = fopen("tmp","wb"); rewind(fp); while(fread(&e,recsize,1,fp) == 1) { /*lire tous les enregistrements du fichier*/ if(strcmp(e.nom,empmatricule) != 0) { /* si les donnees entrees correspondent*/ /*deplacer tous les enregistrements excpetes ce qui doit etre efface */ fwrite(&e,recsize,1,ft); printf("supprimer un autre enregistrement ? (y/n)"); fflush(stdin); autrechoix = getche(); } } } fclose(fp); fclose(ft); remove("EMP.DAT"); /*retirer le fichier original*/ rename("tmp.dat","EMP.DAT"); /*renomer le fichier temporaire au fichier original*/ fp = fopen("EMP.DAT", "rb+"); break; } return 0; }
j'ai reussi finalement à faire sa mais le problème c'est un fichier .dat (binaire) que j'ai pu creer et c'est fou mais je n'arrive pas à le mettre en .txt .
peux tu voir et proposer une solution ?
je sollicite votre aide
merci d'avance
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
29 juin 2015 à 22:13
29 juin 2015 à 22:13
Ouah, tu as bien avancé :-).
#include <conio.h>
#include <windows.h>
Pourquoi avoir remis ce que tu avais enlevé ? C'est non portable...
struct emp{
int matricule;
char nom[40];
char prenom[40];
char sexe [1];
int datenai ;
};
A mettre à l'extérieur de ta fonction main(). Comme tu l'avais fait au début.
exit(1);
Plutôt
fflush(stdin);
Non standard. Si tu souhaites vider le buffer, il faut le vider manuellement via une boucle for sur getchar().
autrechoix = getche();
Non standard. Utilise plutôt
j'ai reussi finalement à faire sa mais le problème c'est un fichier .dat (binaire) que j'ai pu creer et c'est fou mais je n'arrive pas à le mettre en .txt .
Normal, tu écris avec fwrite(). Est-ce gênant ?
Note : dommage que tu n'aies pas de fonctions. Car là ton programme est dur à lire.
Cdlt,
#include <conio.h>
#include <windows.h>
Pourquoi avoir remis ce que tu avais enlevé ? C'est non portable...
struct emp{
int matricule;
char nom[40];
char prenom[40];
char sexe [1];
int datenai ;
};
A mettre à l'extérieur de ta fonction main(). Comme tu l'avais fait au début.
exit(1);
Plutôt
return EXIT_FAILURE;
fflush(stdin);
Non standard. Si tu souhaites vider le buffer, il faut le vider manuellement via une boucle for sur getchar().
autrechoix = getche();
Non standard. Utilise plutôt
getchar();.
j'ai reussi finalement à faire sa mais le problème c'est un fichier .dat (binaire) que j'ai pu creer et c'est fou mais je n'arrive pas à le mettre en .txt .
Normal, tu écris avec fwrite(). Est-ce gênant ?
Note : dommage que tu n'aies pas de fonctions. Car là ton programme est dur à lire.
Cdlt,
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
29 juin 2015 à 23:04
29 juin 2015 à 23:04
Ben si tu veux que ce soit en texte, il faut que tu abandonnes fwrite()/fread(). Et que tu reviennes à fprintf(...)/fscanf(...). Enfin bon, ça va compliquer... C'est toi qui vois :-).
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
30 juin 2015 à 17:12
30 juin 2015 à 17:12
je veux faire en sorte qu'il affiche le fichier en clair c'est un peu normal
Je ne vois pas en quoi c'est normal :-). Ce n'est pas demandé dans ton énoncé et c'est une chose assez courante d'avoir un fichier non lisible.
En tout cas, si tu souhaites quand même que cela en clair, il faut revoir les fonctions d'écriture et de lecture.
Je ne vois pas en quoi c'est normal :-). Ce n'est pas demandé dans ton énoncé et c'est une chose assez courante d'avoir un fichier non lisible.
En tout cas, si tu souhaites quand même que cela en clair, il faut revoir les fonctions d'écriture et de lecture.