Zaibon

Untitled

Aug 28th, 2011
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.65 KB | None | 0 0
  1. short examen_insert(Examen *pExam, long *pto,long *ptl)
  2. {
  3.     FILE *pf = fopen(F_EXAMEN,"r+b");
  4.     Examen temp;
  5.     short erreur = 0;
  6.     long offsetPrecedent = -1,offsetTemp = -1,offsetInsertion = -1;
  7.    
  8.     if(pf != NULL)/*ouverture fichier ok*/
  9.     {
  10.         /*déplacement au ptl et lecture de la strucure .*/
  11.          if(fseek(pf,*ptl,SEEK_SET) == 0 && fread(&temp,sizeof(Examen),1,pf) == 1)
  12.         {
  13.              /*mise a jour du ptl*/
  14.              offsetInsertion = *ptl;
  15.              *ptl = temp.offsetSvt;
  16.              fseek(pf,sizeof(long),SEEK_SET);
  17.              fwrite(ptl,sizeof(long),1,pf);
  18.         }
  19.          if(*pto == -1)
  20.          {
  21.              /*si le chainage est vide*/
  22.              *pto = 2*sizeof(long);
  23.              fseek(pf,0,SEEK_SET);
  24.              fwrite(pto,sizeof(long),1,pf);
  25.              fseek(pf,offsetInsertion,SEEK_SET);
  26.              pExam->offsetSvt = -1;
  27.              fwrite(pExam,sizeof(Examen),1,pf);
  28.          }
  29.          else
  30.          {
  31.             /*déplacement a la premier entrée de la liste et lecture de l'examen*/
  32.             if(fseek(pf,*pto,SEEK_SET) == 0 && fread(&temp,sizeof(Examen),1,pf) == 1)
  33.             {
  34.                 /*on avance dans la liste temps que le nouvel examen est plus grand que l'examen courant
  35.                  et qu'on est pas a la fin du fichier*/
  36.                 while( pExam->nomenclature >= temp.nomenclature && !feof(pf))
  37.                 {
  38.                     /*on conserve l'offset de l'entrée précedente*/
  39.                     offsetPrecedent = ftell(pf) - sizeof(Examen);/*on retire une fois la taile de la structure exam, car fread fait avancer le pointeur*/
  40.                     /*si erreur de déplacement ou de lecture => erreur*/
  41.                      if(temp.offsetSvt != -1)
  42.                      {
  43.                          if(fseek(pf,temp.offsetSvt,SEEK_SET) != 0 || fread(&temp,sizeof(Examen),1,pf) != 1)
  44.                                 erreur = 1;
  45.                      }else
  46.                          break;
  47.                 }
  48.  
  49.                 /*on a trouvé la bonne place*/
  50.                   if(offsetPrecedent == -1)
  51.                   {
  52.                         /*premier du chainage*/
  53.                         fseek(pf,*pto,SEEK_SET);
  54.                         fread(&temp,sizeof(Examen),1,pf);
  55.                          /*mise a jour pointeur du nouvelle examen*/
  56.                         pExam->offsetSvt = *pto;
  57.                         fseek(pf,offsetInsertion,SEEK_SET);
  58.                         fwrite(pExam,sizeof(Examen),1,pf);
  59.                         /*mise a jour pto*/
  60.                         *pto = offsetInsertion;
  61.                         fseek(pf,0,SEEK_SET);
  62.                         fwrite(pto,sizeof(long),1,pf);
  63.                     }
  64.                     else
  65.                     {
  66.                         /*insetion dans le chainage*/
  67.                        /*mise a jour pointeur du nouvel exam*/
  68.                          fseek(pf,offsetPrecedent,SEEK_SET);
  69.                          fread(&temp,sizeof(Examen),1,pf);
  70.                          pExam->offsetSvt = temp.offsetSvt;
  71.                          temp.offsetSvt = offsetInsertion;
  72.                          fseek(pf,offsetPrecedent,SEEK_SET);
  73.                          fwrite(&temp,sizeof(Examen),1,pf);
  74.                         /*ecriture du nouvel examen dans le fichier*/        
  75.                         fseek(pf,offsetInsertion,SEEK_SET);
  76.                         fwrite(pExam,sizeof(Examen),1,pf);          
  77.                     }
  78.                 }
  79.             else
  80.                 erreur =1;
  81.          }          
  82.          fclose(pf);
  83.     }
  84.     else
  85.     {
  86.         erreur =1;
  87.     }
  88.    
  89.    
  90.    
  91.     if(erreur == 1)
  92.         printf("Erreur d'acces au fichier %s\n",F_EXAMEN);
  93.  
  94. }
Advertisement
Add Comment
Please, Sign In to add comment