Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- short examen_insert(Examen *pExam, long *pto,long *ptl)
- {
- FILE *pf = fopen(F_EXAMEN,"r+b");
- Examen temp;
- short erreur = 0;
- long offsetPrecedent = -1,offsetTemp = -1,offsetInsertion = -1;
- if(pf != NULL)/*ouverture fichier ok*/
- {
- /*déplacement au ptl et lecture de la strucure .*/
- if(fseek(pf,*ptl,SEEK_SET) == 0 && fread(&temp,sizeof(Examen),1,pf) == 1)
- {
- /*mise a jour du ptl*/
- offsetInsertion = *ptl;
- *ptl = temp.offsetSvt;
- fseek(pf,sizeof(long),SEEK_SET);
- fwrite(ptl,sizeof(long),1,pf);
- }
- if(*pto == -1)
- {
- /*si le chainage est vide*/
- *pto = 2*sizeof(long);
- fseek(pf,0,SEEK_SET);
- fwrite(pto,sizeof(long),1,pf);
- fseek(pf,offsetInsertion,SEEK_SET);
- pExam->offsetSvt = -1;
- fwrite(pExam,sizeof(Examen),1,pf);
- }
- else
- {
- /*déplacement a la premier entrée de la liste et lecture de l'examen*/
- if(fseek(pf,*pto,SEEK_SET) == 0 && fread(&temp,sizeof(Examen),1,pf) == 1)
- {
- /*on avance dans la liste temps que le nouvel examen est plus grand que l'examen courant
- et qu'on est pas a la fin du fichier*/
- while( pExam->nomenclature >= temp.nomenclature && !feof(pf))
- {
- /*on conserve l'offset de l'entrée précedente*/
- offsetPrecedent = ftell(pf) - sizeof(Examen);/*on retire une fois la taile de la structure exam, car fread fait avancer le pointeur*/
- /*si erreur de déplacement ou de lecture => erreur*/
- if(temp.offsetSvt != -1)
- {
- if(fseek(pf,temp.offsetSvt,SEEK_SET) != 0 || fread(&temp,sizeof(Examen),1,pf) != 1)
- erreur = 1;
- }else
- break;
- }
- /*on a trouvé la bonne place*/
- if(offsetPrecedent == -1)
- {
- /*premier du chainage*/
- fseek(pf,*pto,SEEK_SET);
- fread(&temp,sizeof(Examen),1,pf);
- /*mise a jour pointeur du nouvelle examen*/
- pExam->offsetSvt = *pto;
- fseek(pf,offsetInsertion,SEEK_SET);
- fwrite(pExam,sizeof(Examen),1,pf);
- /*mise a jour pto*/
- *pto = offsetInsertion;
- fseek(pf,0,SEEK_SET);
- fwrite(pto,sizeof(long),1,pf);
- }
- else
- {
- /*insetion dans le chainage*/
- /*mise a jour pointeur du nouvel exam*/
- fseek(pf,offsetPrecedent,SEEK_SET);
- fread(&temp,sizeof(Examen),1,pf);
- pExam->offsetSvt = temp.offsetSvt;
- temp.offsetSvt = offsetInsertion;
- fseek(pf,offsetPrecedent,SEEK_SET);
- fwrite(&temp,sizeof(Examen),1,pf);
- /*ecriture du nouvel examen dans le fichier*/
- fseek(pf,offsetInsertion,SEEK_SET);
- fwrite(pExam,sizeof(Examen),1,pf);
- }
- }
- else
- erreur =1;
- }
- fclose(pf);
- }
- else
- {
- erreur =1;
- }
- if(erreur == 1)
- printf("Erreur d'acces au fichier %s\n",F_EXAMEN);
- }
Advertisement
Add Comment
Please, Sign In to add comment