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
bonjour ,

je fais face a une difficulté pour terminer mon exercice

je dois créer un programme qui permettra de créer un fichier pour les ouvriers d`une société avec leur nom , leur prénom , sexe et date de naissance , leur matricule . Ensuite ce programme doit être capable de demander à l'aide d'un menu :

1. si on veut ajouter un ouvrier a la liste de ce fichier

2. si on veut supprimer la liste des ouvriers en saisissant leur numéro matricule

3. si on veut on veut consulter l'information d'un ouvrier en saisissant son numéro matricule

#include<stdio.h>
#include<conio.h>
#include <stdlib.h>

main()
{
FILE *FICHIER ;
char nom[30] ,prenom[30] ,NOM_FICHIER[30] ,sexe[10];
int matricule , datedenaissance ,n,i ;

/*creer le fichier a remplir */
printf("Entrez le nom du fichier :\n ");
scanf("%s", NOM_FICHIER);
FICHIER = fopen(NOM_FICHIER, "w");

for ( i=0 ;i<1;i++)
{
printf("ouvrier Numero %d \n ",i+1);
printf("entrez votre matricule SVP \n");
scanf("%d", &matricule);
printf("entrez votre nom SVP \n");
scanf("%s", nom);
printf("entrez votre prenom svp\n");
scanf("%s", prenom);
printf("sexe M/F \n");
scanf("%s", sexe);
printf("entrez votre date de naissance\n");
scanf("%d", &datedenaissance);
fprintf(FICHIER, "%d\n%s\n%s\n%s\n%d\n", matricule,nom ,prenom,sexe,datedenaissance);
}/*fermetture du fichier */
fclose(FICHIER);

printf("------------menu--------------------------\n");
printf("1- Ajouter un ouvrier a la liste \n ");
printf("2-affichage de tous les enregistrements de ce fichier \n");
printf("3-consulter une info grace a son matricule \n");
printf("4-supprimer une info grace a son matricule \n");
scanf("%d",&n);


switch(n)
{
case 1:

break;

case 2:
/* Affichage du fichier */

printf("*** Contenu du fichier %s ***\n", NOM_FICHIER);

for ( i=0 ;i<1;i++)
{

fscanf(FICHIER, "%d\n%s\n%s\n", &matricule, nom, prenom,sexe);

printf("Matricule : %d\t", matricule);

printf("Nom et prénom : %s %s\n", nom, prenom);

}

/* Fermeture du fichier */

fclose(FICHIER);


break;

case 3:
printf("");
break;

case 4:
printf("");
break;

}

getch();
}



mon problème je bloque à partir du menu

quelqu'un pourrait m'aider SVP ?

merci d'avance
A voir également:

6 réponses

Utilisateur anonyme
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
27 juin 2015 à 14:22
Bonjour,

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,
0
Utilisateur anonyme
28 juin 2015 à 09:04
#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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > Utilisateur anonyme
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>
0
OK je vais essayée je m'y met au travail
0
Utilisateur anonyme
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.
0
Utilisateur anonyme
28 juin 2015 à 19:30
pour lire les donnees les tableaux de structures je pense
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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 :

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.
0
Utilisateur anonyme
28 juin 2015 à 19:41
Je crois que je suis melange :D
0
Utilisateur anonyme
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 .
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.
0
Utilisateur anonyme
28 juin 2015 à 19:56
mais mes fonctions sont correctes ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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
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,
0
Utilisateur anonyme
29 juin 2015 à 22:16
oui c'est gênant parce que je n'arrive pas à ouvrir le fichier avec un éditeur de texte , est ce que tu peux me dépanner sur ce coup?
0
Utilisateur anonyme
29 juin 2015 à 22:17
et merci pour les corrections je pense corrigé sa , t'inquiète pour les fonctions j'y travaille .
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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 :-).
0
Utilisateur anonyme
30 juin 2015 à 11:46
je veux faire en sorte qu'il affiche le fichier en clair c'est un peu normal .
mais le problème c'est la structure de la fonction fscan et fprintf , elles sont différentes de celle de fwrite et fread donc je me mélanges un peu .
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.
0