Exercice manipulation de fichier

Résolu/Fermé
Signaler
-
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
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

6 réponses


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
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 797
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,
Utilisateur anonyme
#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
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 797 > Utilisateur anonyme
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>
OK je vais essayée je m'y met au travail

#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
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 797
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.
Utilisateur anonyme
pour lire les donnees les tableaux de structures je pense
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 797
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.
Utilisateur anonyme
Je crois que je suis melange :D

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 .
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 797
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.
Utilisateur anonyme
mais mes fonctions sont correctes ?
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 797
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.

 #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
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 797
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,
Utilisateur anonyme
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?
Utilisateur anonyme
et merci pour les corrections je pense corrigé sa , t'inquiète pour les fonctions j'y travaille .
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 797
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 :-).
Utilisateur anonyme
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 .
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 797
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.