Aide en C merci d'avance

Fermé
Nouss - 4 mai 2005 à 18:24
sam3000 Messages postés 1225 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 - 7 mai 2005 à 11:50
Bonjours à tous !
Voilà j'ai un souci dans mon programme C et je voudrais savoir si vous pouviez m'éclaircir voilà mes questons :

Quand on complile le programme il marche nickel par exemple on veut créer un une Base de donnée pour les vhs cela crée le fichier vhs.txt avec seulement une seule donnée !!! alors qu'on a défini le typedef film avec le Nom et le Genre (je pense que c'est assez bizarre )

Sinon lorsqu'on veut ajouter un autre film, le fichier s'ouvre ( ou recrée un autre fichier du meme nom ??) et lorsqu'on écrit dessus ca ecrase les données précédantes

enfin je voudrais savoir comment on pourrais faire pour rester dans le programme et que une fois que l'on a ajouter un film dans la base de donnée comment on pourrais retourné au menu principal.

et si il y aurait des fautes de syntaxes de me dire ou sont les fautes ^^

Je vous remercie d'avance

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


typedef struct{ 

   char nom[20]; 
   char genre[20]; 

}FICHE; 

typedef enum 
{ 
    CatProduitVHS =1, 
    CatProduitDVD, 
    CatProduitLivre, 
    CatProduitCD, 
}CatProduit; 

FILE* OuvrirFichier(CatProduit CatProd) 

//ouvre le fichier du produit selon sa categorie

{ 
    FILE * tmpFile; 

    switch(CatProd) 
        { 

        case CatProduitVHS : 
            tmpFile = fopen("vhs.txt","a"); /* <- peut etre un pb ici ? */
            
            break; 

        case CatProduitDVD : 
            tmpFile = fopen("dvd.txt","a"); /* <- peut etre un pb ici ? */
            break; 

        case CatProduitLivre : 
            tmpFile = fopen("livre.txt","a"); /* <- peut etre un pb ici ? */
            break; 

        case CatProduitCD : 
            tmpFile = fopen("CD.txt","a"); /* <- peut etre un pb ici ? */
            break; 

        default : 
            break; 
        } 

    return tmpFile; 
} 

int InsererProduit(FILE * fichierProduit,CatProduit CatProd, FICHE *Prod) 

//On insere le Produit dans le fichier Produit selon sa Categorie 
{ 
	/* On insère les données à la fin !! */
	fseek(fichierProduit,0,SEEK_END); /* <- peut etre surtout un pb ici ? */
    // on écrit 
    fflush(stdout);
    fwrite(Prod,sizeof(FICHE),1,fichierProduit); 
    fflush(stdin);
            
    return(1); 

} 

void AfficherProduit(FILE * fichierProduit,CatProduit CatProd, FICHE *Prod) 
//Affiche le produit à partir d'un fichier selon sa catégorie
{ 
	FILE * tmpFile;
//	char a;
    switch(CatProd) 
        { 
	
        case CatProduitVHS :
			
			tmpFile = fopen("vhs.txt","r");
			printf("%s\n",(*Prod).nom);
			fflush(stdout);
			printf("%s\n",(*Prod).genre);
			fflush(stdout);
			break; /* La on voudrait revenir une fois qu'on a ecrit les 
			données revenir au programme principal	*/

        case CatProduitDVD : 
            tmpFile = fopen("dvd.txt","r");
			printf("%s\n",(*Prod).nom);
			printf("%s\n",(*Prod).genre);
            break; /* de même ici */

        case CatProduitLivre : 
            break; 

        default : 
            break; 
        } 
  

} 
//Fonction de du menu inserer affichier ( test )

void InsererAfficherProduit(int choixProd,FILE *fichierProduit,CatProduit CatProd,FICHE *Prod)

//selon ChoiProd Inserer ou afficher le produit  selon la categorie
{
	switch(choixProd)
	{
		case 1:
			switch(CatProd) 
			{
				case CatProduitVHS :
					printf("Nom du VHS : "); 
					fflush(stdout);
					scanf("%s",Prod->nom); 
					fflush(stdin);
					printf("Genre du VHS : "); 
					fflush(stdout);
					scanf("%s",Prod->genre); 
					fflush(stdin);
					break;
				case CatProduitDVD :
					printf("Nom du DVD : "); 
					fflush(stdout);
					scanf("%s",Prod->nom); 
					fflush(stdin);
					printf("Genre du DVD : "); 
					fflush(stdout);
					scanf("%s",Prod->genre); 
					fflush(stdin);
					break;
				case CatProduitLivre:
					printf("Nom du Livre : "); 
					fflush(stdout);
					scanf("%s",Prod->nom); 
					fflush(stdin);
					printf("Genre du Livre : "); 
					fflush(stdout);
					scanf("%s",Prod->genre); 
					fflush(stdin);
					break;
				case CatProduitCD :
					printf("Nom du CD : "); 
					fflush(stdout);
					scanf("%s",Prod->nom); 
					fflush(stdin);
					printf("Genre du CD : "); 
					fflush(stdout);
					scanf("%s",Prod->genre); 
					fflush(stdin);
					break;									
			}
						
			InsererProduit(fichierProduit,CatProd,Prod); 
			
        case 2:
        	AfficherProduit(fichierProduit,CatProd,Prod);
            break;
	}
return;
}

int main () 
{ 
    FICHE *Prod; 
    FILE *Fichier; 
//    char buffer[100];

	int choixProd,choixCat;
	CatProduit CatProd;
// il faut choisir entre DVD et VHS -_- 
	printf("Bienvenu dans le programme de Location \n\n");
    printf("1.VHS \n");
    printf("2.DVD \n");
    printf("3.Livre \n");
    printf("4.CD \n\n");
    printf("Votre Choix : ");
    fflush(stdout);
    scanf("%d",&choixCat); 
    switch(choixCat)
    {       
         case 1 :
              CatProd = CatProduitVHS;
              break;
         case 2 :
              CatProd = CatProduitDVD;
              break;
         case 3 :
              CatProd = CatProduitLivre;
              break;
         case 4 :
              CatProd = CatProduitCD;
              break;
         default :
                break;
          }

    Prod=(FICHE*)malloc(sizeof(FICHE)); 

// On ouvre le fichier correpondant à la catégorie désigner par CatProd

    Fichier= OuvrirFichier(CatProd);

	printf("1.Inserer Produit \n");
	printf("2.Afficher Produit \n");
	fflush(stdout);
	scanf("%d",&choixProd); 
	fflush(stdin);
	InsererAfficherProduit( choixProd,Fichier,CatProd,Prod);
	return(1); 
}

5 réponses

Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 110
4 mai 2005 à 19:28
salut =)

bon je m'excuse parce que je n'ai lu ton code en entier, mais c'est possible que l'erreur se situe quand tu écris dans le fichier :
fwrite(Prod,sizeof(FICHE),1,fichierProduit); 

car tu passes une structure, et la fonction fwrite attend une chaine de caractères. or une chaine de caractères s'arrête quand il y a un 0, qui est après le nom de ton film.

il faudrait donc que tu essaies d'écrire d'abord que le nom et ensuite le genre.

je ne sais pas si c'est ça, mais ca peut être une piste.

++
0
Merci Luffy

Mais en fait j'expose mon problème, je m'explique en utilisant visual C ++ et lorsque je compile je rentre les données pour le Nom et le Genre, mais lorsque j'ouvre le fichier txt crée il m'affiche des caractères bizarre ( 穡e췍췍췍췍췍췍췍췍穡e췍췍췍췍췍췍췍췍 )
est-ce normal ?
Je ne pense pas car lorsque je demande d'afficher ce qui se trouve dans le texte je n'obtients pas les infos que j'ai ecrite en txt

Sur un autre compilateur C ( Eclipse ) une seul donée parmis les deux sont visibles dans le fichier txt donc je sais pas si j'ai fais des fautes lors de l'écriture des fonctions mais cela m'intrigue bcp.

Quelqu'un peut il maider à y voir plus clair?

Merci d'avance ^^
0
sam3000 Messages postés 1225 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
5 mai 2005 à 16:40
une piste (que je pense juste!)
par exemple dans la fonction AfficherProduit, tu ne fait qu'ouvrir le fichier, puis tu affiche le contenu de la structure!
il n'y a pas de fonction de lecture des donnees à partir du fichier-> appel de fread( )

l'acces à des donnees doit suivre un ordre precis:
   fd=fopen("fichier","r");
   fread(fd,... );
   fclose(fd);

Pour l'ecriture dans fichier:
   fd=fopen("fichier","w");
   fwrite(fd,... );
   fclose(fd);
0
Merci sam3000
Je vais esseyer de faire une fonction qui selon le fichier ouvert lancera le fread aproprié mais a ton avis ou dois je mettre les fcloses sachant qu'il y en aura 4 ( un pour les DVD, un pour VHS, un pour Livre et un pour CD )

Et la question qui me turlupine depuis pas mal de temps
Je voudrais savoir comment on pourrais faire pour rester dans le programme et qu'une fois que l'on a ajouté un film dans la base de donnée comment on pourrais retourner au menu principal.

Merci pour votre aide ! ^^
0

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

Posez votre question
sam3000 Messages postés 1225 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 13 juin 2005 144
7 mai 2005 à 11:50
c'est une question d'alogorithmique!

la structure du programme devrais etre:
declaration des variables globales

fonction menu_option1()
{
}

fonction menu_option2()
{
}

fonction menu_option3()
{
}

main()
{
   int quitter=0;
   int choix;
   do
   {
       //affichage du menu
       printf("0-quitter\n");
       printf("1-option 1\n");
       printf("2-option 2\n");
       printf("3-option 3\n");
       printf("votre choix:");scanf("%d",&choix);

       //execution de la fonction choisie
       switch(choix)
       {
        case 0: quitter=1;break;
        case 1: menu_option1();break;
        case 2: menu_option2();break;
        case 3: menu_option3();break;
        }
    } while (!quitter);
}
0