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++Builder Discussion :

Modifier un fichier ligne à ligne


Sujet :

C++Builder

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Modifier un fichier ligne à ligne
    Bonjour,

    Je souhaite modifier un fichier (de type texte) ligne à ligne (lignes de longueur fixe 450) selon des critères biens défini, à savoir : si les caractères 4 et 5 sont différents de '00' et les caractères 449 et 450 sont différents de 'C9' alors remplacer les caractères 41 à 47 par des espaces.
    Voici ce que j'ai fait :

    Remarque : 'liste' contient la liste des fichiers d'un dossier donné

    Code C++ : 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
    FILE *fichier;
                    char ligne_lu[512];
                    char local_file[512];
                    char *ptb, z = 'get';
     
                    for(int n=0; n<liste->Count; n++)
                    {
                            strcpy(local_file, liste->Strings[n].c_str());
                            ptb = strchr(local_file, z);
     
                            if(!ptb) { // on ne traite pas les fichiers "budget****" (renommés en local "get****")
                                    TStringList *contenu = new TStringList;
     
                                    fichier = fopen(local_file, "w+");
                                    if(fichier == NULL)
                                    {
                                            StatusBar1->SimpleText = "Impossible d'ouvrir le fichier "+AnsiString(local_file);
                                            exit(1);
                                    }
                                    fseek(fichier, 0, 0);
                                    while(fgets(ligne_lu, 512, fichier) != NULL) {
                                            if((ligne_lu[449] == 'C') && (ligne_lu[450] != '9')) {
                                                    if((ligne_lu[4] != '0') || (ligne_lu[5] != '0')) {
                                                            contenu->Add(AnsiString(ligne_lu).SubString(0, 40)+"       "+AnsiString(ligne_lu).SubString(48, 450));
                                                    }
                                                    else {
                                                            contenu->Add(ligne_lu);
                                                    }
                                            }
                                            else {
                                                    contenu->Add(ligne_lu);
                                            }
                                    }
                                    fclose(fichier);
                                    contenu->SaveToFile(local_file);
                                    contenu->Clear();
                            }
                    }

    'contenu' me sert de buffer pour stocker le contenu modifié ou non de chaque ligne, puis j'écris mon fichier à la fin. Enfin ça c'est en théorie, en pratique soit mon fichier reste inchangé soit mon fichier est vide.

    Comment faire ?
    Peut-être y'a t'il une autre méthode ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut
    Bonjour,

    Dans la mesure où ton fichier contient des lignes de longueur fixe, j'utiliserais la fonction open plutôt que fopen:

    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
     
    #include <io.h>
    #include <fcntl.h>
    #include <sys\stat.h>
     
    #define LG_LIG 451 //451 ou 452 ? tout dépend si le caractère terminal
                               // d'une ligne est le '\n' ou la séquence \r\n
     
    ...
     
     
      int f = open(local_file,O_RDWR|O_BINARY);
      if (f != 0)
      {
        // erreur
      }
      lseek(f,0L,0);
     
      while (read(f,ligne_lu,LG_LIG) == LG_LIG)
      {
        if (ligne_lu[3] && ligne_lu[4] && (ligne_lu[448] != 'C' || ligne_lu[449] != '9'))
        {
          memset(&ligne_lu[40],' ',7);
          long offset = lseek(f,0L,1);  // pointeur courant ds le fichier
          lseek(f,-LGLIG,1);
          write(f,ligne_lu,LGLIG);
          lseek(f,offset,0);
        }
      }
      close(f);

  3. #3
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Tu pourrais utiliser une TStringList

    Cela te permetterait de charger ton Fichier directement. De pouvoir manipuler chaque ligne et ensuite de le savegarder.

  4. #4
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Salut, tu as un exemple ici

Discussions similaires

  1. Lire un fichier csv ligne à ligne sous Talend
    Par NFHnv dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 13/03/2015, 14h57
  2. Problème de lecture d'un fichier texte ligne à ligne
    Par petit rabot dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 25/05/2011, 14h04
  3. [AC-2000] Export Access vers fichier txt ligne à ligne
    Par jorge54 dans le forum VBA Access
    Réponses: 14
    Dernier message: 23/01/2010, 02h15
  4. [FTP] Pouvoir lire et modifier un fichier en ligne
    Par ultraxa dans le forum Langage
    Réponses: 2
    Dernier message: 29/10/2008, 23h56
  5. Réponses: 11
    Dernier message: 02/11/2006, 16h50

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