Partage
  • Partager sur Facebook
  • Partager sur Twitter

bibliothèque en C

ce bout de code fait planter mon programme

Sujet résolu
    24 janvier 2020 à 12:38:17

    bonjour messieurs. j'ai pour mini projet la création d'un programme en langage c pour la gestion de bibliothèque. notre programme devrait permettre d'ajouter un étudiant à la bibliothèque, le modifier et le supprimer, ajouter et supprimer un livre à la bibliothèque,enregistrer et supprimer les emprunts. Ainsi le mini projet a été divisé en plusieurs fonctions. le bout de code suivant est tiré de la fonction ajouterEmprunt qui nous permet d'enregistrer les différents emprunts des étudiants. voici le code 

    if(rechEmpt(numempt)==1)
        {
            printf("\n Cet Etudiant a un Emprun en cour");
        }
        else
            {
                fscanf(Fl,"%d ;%s ;%s ;%s \n",&lvr.numLi,lvr.NomLivre,lvr.NomAuteur,lvr.DescriptionLivre);
                fscanf(F,"%d ;%s ;%s ;%s \n",&Etud.Num,Etud.Nom,Etud.Prenom,Etud.Filiere);
               do
                {
                    if(numli==lvr.numLi)
                    {
                            strcpy(Emp.TitreLivre,lvr.NomLivre);
                            strcpy(Emp.NomAuteur,lvr.NomAuteur);
                    }
                }while(!feof(Fl));
               do
                {
                    if(numempt==Etud.Num)
                    {
                                strcpy(Emp.Nom,Etud.Nom);
                                strcpy(Emp.Prenom,Etud.Prenom);
                                strcpy(Emp.Filiere,Etud.Filiere);
    
                    }
                }while(!feof(F));
                fprintf(f,"%d ;%s ;%s ;%s ;%s ;%s \n",Emp.Num,Emp.Nom,Emp.Prenom,Emp.Filiere,Emp.TitreLivre,Emp.NomAuteur);
            }

    les structures do while que j'ai intégré dans le code me permettent  de me déplacer dans le fichier en leur absence le programme s'exécute bien mais en les variables ne récupère que les premières valeurs des fichiers étudiants et livre.  s'il vous plait comment pourrais je effectuer le déplacement dans le fichier à la recherche des valeurs adéquates

    • Partager sur Facebook
    • Partager sur Twitter
      24 janvier 2020 à 13:00:45

      Bonjour ! En général on se déplace dans un fichier en mode séquentiel : le premier enregistrement, puis le deuxième, puis le troisième, et ainsi de suite. Pour insérer, modifier, supprimer, etc. des enregistrements, il me semble plus simple de commencer par lire tout le fichier et le mettre en mémoire (par exemple en copiant les enregistrements dans un tableau), et ensuite de faire les manipulations sur le tableau. C'est seulement à la fin qu'on rapatrie le tableau dans le fichier (écriture) pour le mettre à jour.
      • Partager sur Facebook
      • Partager sur Twitter
        24 janvier 2020 à 13:19:05

        voici l'ensemble du code de la fonction AjoutéEmprun
        void AjouterEmprun()
        {
            FILE*Fl,*F,*f;
            Fl=fopen("Livre.txt","r");
            F=fopen("Etudiants.txt","r");
            f=fopen("Emprunt.txt","a");
            //time_t t=time(NULL);
            int numEmp,i;
            char rep;
            printf("\n Entrez le nouveau numero d'emprun:  ");
            scanf("%d",&numEmp);
            while(rechEmp(numEmp)==1)
            {
                printf("n Ce numero d'emprun existe deja :");
                printf("\n Entre le nouveau numero d'emprun:");
                scanf("%d",&numEmp);
            }
            Emp.Num=numEmp;
            printf("\n entrez le numéro du livre:");
            int numli;
            scanf("%d",&numli);
            while(rechLvr(numli)!=1)
            {
                printf("le livre n'existe pas");
                printf("\n entrez le numéro du livre:  ");
                scanf("%d",&numli);
            }
            printf("\n entrez le numéro de l'empreunteur: ");
            int numempt;
            scanf("%d",&numempt);
            while(rech(numempt)!=1)
            {
                printf("\n Cet Etudiant n'est pas inscrit voullez vous l'inscrire O/N? ");
                scanf("%c",&rep);
                if(rep=='o'||rep=='O')
                {
                    AjouterEtudiant();
                }
                else
                {
                    printf("veillez entre le numero d'un etudiant inscrit:  ");
                    scanf("%d",&numempt);
                }
        
            }
            if(rechEmpt(numempt)==1)
            {
                printf("\n Cet Etudiant a un Emprun en cour");
            }
            else
                {
                    fscanf(Fl,"%d ;%s ;%s ;%s \n",&lvr.numLi,lvr.NomLivre,lvr.NomAuteur,lvr.DescriptionLivre);
                    fscanf(F,"%d ;%s ;%s ;%s \n",&Etud.Num,Etud.Nom,Etud.Prenom,Etud.Filiere);    
                do{
                        if(numli==lvr.numLi)
                        {
                                strcpy(Emp.TitreLivre,lvr.NomLivre);
                                strcpy(Emp.NomAuteur,lvr.NomAuteur);
                        }
                    }while(!feof(Fl));
                 do{
                        if(numempt==Etud.Num)
                        {
                                    strcpy(Emp.Nom,Etud.Nom);
                                    strcpy(Emp.Prenom,Etud.Prenom);
                                    strcpy(Emp.Filiere,Etud.Filiere);
        
                        }
                   }while(!feof(Fl));
                    fprintf(f,"%d ;%s ;%s ;%s ;%s ;%s \n",Emp.Num,Emp.Nom,Emp.Prenom,Emp.Filiere,Emp.TitreLivre,Emp.NomAuteur);
                }
                fclose(Fl);
                fclose(F);
        }

        -
        Edité par CyberByteX 24 janvier 2020 à 13:25:27

        • Partager sur Facebook
        • Partager sur Twitter
          24 janvier 2020 à 13:26:48

          Et que penses-tu de ma réponse ?

          • Partager sur Facebook
          • Partager sur Twitter
            24 janvier 2020 à 13:46:45

            pour votre réponse je ne la comprend pas très bien!! vous savez je suis débutant en langage c :(

            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2020 à 20:24:28

              Si j'ai bien compris tu lis des structures dans un fichier et tu les gères une à la fois.
              Pour avoir déjà programmé la gestion des prêts dans une bibliothèque moi-même (il y a un million d'années ...)
              je sais qu'il faut trois éléments:
              + le dossier des emprunteurs
              + le dossier des livres
              + le dossier des transactions de prêts.
              Cela peut devenir compliqué que de se promener sur les fichiers.
              Imagine que tu lises les fichiers au complet avec un seul 'read' et que tu les places dans la mémoire.
              S'ils sont triés de la bonne façon ou si tu te crées un index, par exemple dans un tableau, qui te permette d'accéder rapidement à chaque élément, ce sera plus facile.
              Tu n'as pas à t'encombrer avec la lecture sur disque à chaque accès à un élément.
              Une fois la gestion complétée, tu recopies les fichiers sur disque avec un seul (ou un minimum) de 'write'.
              Tu isoles les fonctions d'entrée-sortie des fonctions de gestion.
              Ça sera beaucoup plus facile de cette façon.
              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                24 janvier 2020 à 20:31:16

                Tu dis être débutant, mais tu utilises des structures, donc tu as probablement vu aussi les tableaux (non ?). Ce que je disais, c'était de lire une bonne fois pour toutes les fichier et de placer les enregistrements dans un tableau (un tableau de structures, donc). Ensuite, on manipulera ce tableau. Ce sera plus facile car on peut faire plein de choses avec un tableau, tandis qu'un fichier ne peut-être parcouru que séquentiellement.

                Par exemple comment supprimer directement un enregistrement d'un fichier ? Je ne suis pas un expert, mais je ne vois pas. C'est peut-être possible ? Ou pas... Par contre, supprimer un élément d'un tableau, on sait faire.

                Et à la fin, on écrit le tableau (avec ses ajouts, ses modifications, ses suppressions) dans le fichier de départ.

                Bon, finalement j'ai répété mon premier message... S'il y a des choses que tu ne comprends pas, il faut que tu dises quoi. Par exemple est-ce que tu comprends « enregistrement » ? Un enregistrement est une ligne dans un fichier et correspond à une donnée (une variable du type de la structure). Est-ce que tu comprends « séquentiel » ? L'accès séquentiel, c'est l'accès ligne par ligne (ou octet par octet). Pour accéder à la troisième ligne, il faut avoir lu les deux premières. Alors que dans un tableau, pour accéder au troisième élément, il suffit de lui indiquer le nombre 3 (en fait 2 puisque les indices commencent à 0) : c'est un accès direct.

                • Partager sur Facebook
                • Partager sur Twitter
                  25 janvier 2020 à 1:24:56

                  @robun:
                  » comment supprimer directement un enregistrement d'un fichier ? Je ne suis pas un expert, mais je ne vois pas. C'est peut-être possible ? Ou pas...
                  C'est théoriquement possible si on arrive à tricher le chaînage des blocs sur disque et si on sait faire de la ré-écriture sur disque.
                  Il faut avoir accès aux drivers et c'est contre la philosophie des systèmes d'exploitation.
                  Même quand on fait des blocs artificiels sur disque, cela demande des fonctionalités particulières et des logiciels plus complexes.
                  Je n'encourage personne dans cette direction.
                  Avec les mémoires qqu'on a maintenant, on peut gérer la plupart des fichiers en mémoire.
                  Suppose que tu as besoin de 1000 caractères par emprunteur (ce qui est beaucoup) et que tu as 1000000 d'emprunteurs (ce qui est énorme), tu t'en tire tout de même avec 1 Go.
                  Dans un système de gestion de prêts, le fichier qui est de loin le plus actif, c'est le fichier des transactions de prêts.
                  Il est relativement petit car on ne garde que les codes d'identification pour les livres et les emprunteurs.
                  C'est le seul fichier qui est modifié dans la gestion des prêts.
                  Les fichiers des emprunteurs et des livres sont normalement gérés par d'autres programmes.
                  Ou si on ne veut pas garder en mémoire ces fichiers, on peut les lire et garder en mémoire le code d'identification et la position disque où se trouve l'élément
                  Il est facile de faire des accès directs pour connaître l'information complète.
                  Cela sert surtout pour lagestion des retards où on a besoin de l'adresse et/ou du numéro de téléphone de l'emprunteur et le titre complet du livre
                  Dans une bibliothèque de mon quartier, on émet une carte avec code-bar pour l'emprunteur et les livres ont également un code-bar.
                  La réceptioniste du comptoir des prèts fait un "scan" des code-bar et c'est tout ...
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    26 janvier 2020 à 20:42:55

                    Merci pour vos réactions mes frère mes cela devient de plus en plus difficille au fil du sujet. s'il vous plait dites moi si c'est possible de me déplacer dans mon fichier avec le travail que j'ai déjà effectué si oui comment? sinon un exemple selon votre logique avec mon code. merci. cordialement
                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 janvier 2020 à 22:18:40

                      Le plus simple est de lire le fichier ligne par ligne au tout début du programme et de mettre tout son contenu dans un tableau. Ensuite, au lieu de gérer le fichier, tu gères le tableau (ajout d'éléments d'un tableau, suppression, etc. : ça c'est faisable). Et tout à la fin, tu écris les données du tableau dans le fichier.

                      Si tu veux à tout prix gérer le fichier directement, je ne sais pas faire et je crois que c'est largement plus compliqué, aussi je te le déconseille.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 janvier 2020 à 1:04:57

                        Petit ajout, on ne ré-écrit pas le fichier sur place. On écrit un nouveau fichier.
                        Ensuite, on élimine l'ancien fichier et on renomme le nouveau fichier avec l'ancien nom.
                        Le seul point critique en général est quand l'ordi plante entre l'élimination et le rename.
                        En général on fait ces deux opérations l'une à la suite de l'autre.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Le Tout est souvent plus grand que la somme de ses parties.

                        bibliothèque en C

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown