1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <sys/types.h>
int MaJ(char *source, char *dest, char *idx)
{
FILE *file_src;
FILE *file_dest;
FILE *file_idx;
char ligne[2048];
char num_ligne[11];
char id_eqx[11];
char id_eqx_max[11];
long int nbmax = 2000000000;
long int fois;
long int reste;
unsigned long long int saut;
int i;
int pos;
if((file_src=fopen64(source,"r"))==NULL)
{
printf("Erreur imposible d'ouvrire le fichier %s \n",source);
return -1;
}
if((file_idx=fopen64(idx,"r"))==NULL)
{
printf("Erreur imposible d'ouvrire le fichier %s \n",idx);
return -1;
}
if((file_dest=fopen64(dest,"r+"))==NULL)
{
printf("Erreur imposible d'ouvrire le fichier %s \n",dest);
return -1;
}
if(fseek( file_idx, -22, SEEK_END )==-1)
{
printf("Erreur position dans le fichier %s \n",idx);
return -2;
}
fgets(ligne,sizeof(ligne), file_idx);
strncpy(id_eqx_max,ligne,10);
id_eqx_max[10]=0;
while(fgets(ligne,sizeof(ligne), file_src))
{
strncpy(id_eqx,&ligne[1],10);
id_eqx[10]=0;
if(atoi(id_eqx)>atoi(id_eqx_max))
{
if(fseek( file_dest, 0L, SEEK_END )==-1)
{
printf("Erreur position dans le fichier %s \n",dest);
return -2;
}
}
else
{
rewind(file_idx);
saut=22*(atoi(id_eqx)-1);
fois=saut/nbmax;
reste=saut-(fois*nbmax);
pos=11;
//si le fichier fait plus de 2Go
for(i=0;i<fois;i++)
{
if(fseek( file_idx, nbmax, SEEK_CUR )==-1)
{
printf("Erreur position dans le fichier %s \n",idx);
return -2;
}
}
if ( reste+pos>0)
{
if(fseek( file_idx, reste+pos, SEEK_CUR )==-1)
{
printf("Erreur position dans le fichier %s\n",idx);
return -2;
}
}
fgets(num_ligne,sizeof(num_ligne), file_idx);
if(atoi(num_ligne)>0)
{
fseek(file_dest,0,SEEK_SET);
saut=atoi(num_ligne)-1;
saut=saut*622;
fois=saut/nbmax;
reste=saut-(fois*nbmax);
pos=0;
//si le fichier fait plus de 2Go
for(i=0;i<fois;i++)
{
if(fseek( file_dest, nbmax, SEEK_CUR )==-1)
{
printf("Erreur position dans le fichier %s \n i=%i",dest,i);
return -2;
}
}
if ( reste+pos>0)
{
if(fseek( file_dest, reste+pos, SEEK_CUR )==-1)
{
printf("Erreur position dans le fichier %s \n",dest);
return -2;
}
}
}
else
{
if(fseek( file_dest, 0L, SEEK_END )==-1)
{
printf("Erreur position dans le fichier %s \n",idx);
return -2;
}
}
}
fputs(ligne,file_dest);
}
fclose(file_idx);
fclose(file_src);
fclose(file_dest);
} |
Partager