IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

fseek et fputs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut fseek et fputs
    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

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Le prototype de fseek est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fseek ( FILE * stream, long int offset, int origin );
    Cela veut dire que le déplacement est signé sur 32 bits et donc que tu ne peux gérer des déplacements que de -2 000 000 000 à + 2 000 000 000 (environ)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    oui c'est pour cela que j'effectue des saut de 2 000 000 000.
    Mais ca n'a pas l'air de fonctionner.

    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
     
      long int nbmax = 2000000000;
     
    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;
            }
          }

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    D'abord, je ne suis pas sûr que même si tu fais des sauts successif pour contourner cette limitation, cela fonctionne

    et d'autre part dans cette portion de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          rewind(file_idx);
          saut=22*(atoi(id_eqx)-1);
          fois=saut/nbmax;
          reste=saut-(fois*nbmax);
          pos=11;
    Tu es sûr de ne pas avoir d'erreur suite à débordement de taille ?

    "22*(atoi(id_eqx)-1)", c'est un int je pense et même si tu le stockes dans un long long int, il y a déjà eu débordement, c'est trop tard.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    hum... oui j'ai testé saut m'indique bien la bonne valeur en faisan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%llu\n",saut);
    je vois pas vraiment comment faire

Discussions similaires

  1. [Système] fputs() ecrase tout
    Par fara morgana dans le forum Langage
    Réponses: 7
    Dernier message: 16/06/2006, 11h22
  2. petit problème avec fputs
    Par takai dans le forum Langage
    Réponses: 2
    Dernier message: 04/01/2006, 15h02
  3. Access violation avec fseek
    Par baleine dans le forum C
    Réponses: 7
    Dernier message: 18/03/2005, 16h41
  4. Compréhension de fseek
    Par Argonz dans le forum C
    Réponses: 9
    Dernier message: 12/01/2004, 15h01
  5. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo