j'ai un code qui permet de se déplacer dans des fichiers, de récupérer cetaines informations et d'écrire dedans.
mais je rencontre des problèmes, lorsque je change des ligne au début de mon fichier tout va bien ainsi que d'en ajouté a la fin.
le problème vient lorsque je veux modifié des lignes vers la fin de mon fichier (faut savoir que mon fichier fait presque 4Go).

voici mon code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
}
mes 3 fichier sont de cette forme

src et dest:
"espace+n°id sur 10caractères+250 caractères" [262]


idx:
"n°id sur 10car+;+num de la ligne (ou se situe l'id dans dest) sur 10car" [22]
les id sont écrémenté pour chaque ligne et si un id n'est pas présent dans dest alors num ligne =0

exemple
0000000001;0000000001
0000000002;0000000000 //cet id n'est donc pas présent dans dest
...
0000215666;0000005412
0000215667;0000003564

dest est le fichier qui représente presque 4Go

mon programme prend chaque ligne de src et compare l'id a l'aide de idx.
si le id est supérieur au id de la derniere ligne de idx ou que sont num ligne=0 c'est qu'il n'est pas présent dans dest. On doit donc ajouter à la fin du fichier dest la ligne de src.
Sinon on remplace la ligne de dest par celle de src correspondant à la ligne de l'id.

j'espère être assez compréhensible.

cela fais plusieurs jour que je cherche et que j'essaye plusieurs programmes, et j'ai toujours pas trouvé la solution, je post donc mon problème.

merci pour ce qui consacrerons du temps à mon problème