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 :

Suppression d'un enregistrement dans un fichier.


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Suppression d'un enregistrement dans un fichier.
    Bonjour,

    Je débute un peu en C et C++ et j'aimerais savoir les méthodes qu'il éxiste pour supprimer un enregistrement de type struct dans un fichier.
    Je travaille sur des terminaux de type bancaire donc l'espace mémoire est relativement limité. Donc j'oublie la méthode qui réécrit un nouveau fichier avec comme condition de ne pas y metre l'enregistrement à effacer et puis effacer l'ancien fichier.

    Je connais la méthode d'indexation, mais ce serait réécrire beaucoup de modules du terminal, j'aimerais donc ne pas y avoir recours.

    Merci beaucoup.

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Tu peux faire un fopen() en mode "r+" (ecriture / lecture) et jouer avec fseek(), mais tu vas detruire le fichier (un bug est vite arrive). L'algorithme a developper est bien plus complexe qu'un simple lecture/filtrage/ecriture.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Antoine.V
    Je débute un peu en C et C++ et j'aimerais savoir les méthodes qu'il éxiste pour supprimer un enregistrement de type struct dans un fichier.
    Si l'accès aux enregistrements est simple (taille fixe, repère...) et que tu as prévu un champ pour ça, tu peux marquer l'enregistrement 'supprimé', mais ça ne réduira pas la taille du fichier... (Utilisation du mode "r+", il vaut mieux savoir ce qu'on fait...)
    Je travaille sur des terminaux de type bancaire donc l'espace mémoire est relativement limité. Donc j'oublie la méthode qui réécrit un nouveau fichier avec comme condition de ne pas y metre l'enregistrement à effacer et puis effacer l'ancien fichier.
    Je ne comprend pas ton problème de mémoire. La méthode lecture/filtrage/ecriture consomme très peu de mémoire (un enregistrement). Par contre, pendant le moment du traitement on a besoin de 2 fois la taille du fichier sur le disque, mais c'est temporaire... Quand c'est terminé, on peut effacer l'ancien fichier (si on ne veut pas garder un 'backup' de la version N-1...)

    C'est une méthode éprouvée et surtout très fiable. Ok, il faut un peu de place sur le disque...
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je ne comprend pas ton problème de mémoire. La méthode lecture/filtrage/ecriture consomme très peu de mémoire (un enregistrement). Par contre, pendant le moment du traitement on a besoin de 2 fois la taille du fichier sur le disque, mais c'est temporaire... Quand c'est terminé, on peut effacer l'ancien fichier (si on ne veut pas garder un 'backup de la version N-1...)

    C'est une méthode éprouvée et surtout très fiable. Ok, il faut un peu de place sur le disque...
    Car la mémoire dédiée du terminal fait 2 méga octets. Ce même fichier peut varier entre 0 et 2 méga octets. il suffit que le fichier fasse 1 Mega et 1 octet et c'est foutu...

    Oui j'avais pensé à metre un flag pour signaler que l'enregistrement n'est plus valide et lors d'un prochain ajout d'enregistrement, le mêtre à la place d'un enregistrement signalé non valide par le flag. Ca m'embetait un peu car c'est rajouter un octet à chaque enregistrement dans un fichier qui doit être le plus petit possible mais c'est la solution qui me semble la plus simple pour le moment.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Antoine.V
    Car la mémoire dédiée du terminal fait 2 méga octets.
    Je ne comprends pas. Tu parles de mémoire centrale ou de mémoire sur disque ?
    Ce même fichier peut varier entre 0 et 2 méga octets. il suffit que le fichier fasse 1 Mega et 1 octet et c'est foutu...
    Et ce n'est pas modifiable ? L'administrateur est manchot ou quoi ?
    Oui j'avais pensé à metre un flag pour signaler que l'enregistrement n'est plus valide et lors d'un prochain ajout d'enregistrement, le mêtre à la place d'un enregistrement signalé non valide par le flag. Ca m'embetait un peu car c'est rajouter un octet à chaque enregistrement dans un fichier qui doit être le plus petit possible mais c'est la solution qui me semble la plus simple pour le moment.
    C'est jouable, mais c'est dangereux (pas de sauvegarde, une fausse manip et le fichier est détruit), et il faut que les enregistrements aient une taille fixe... (ce qui est contraire au principe énoncé "un fichier qui doit être le plus petit possible"). Bref, je sens comme un problème majeur de conception ou de compréhension dans cette affaire...
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Antoine.V
    Car la mémoire dédiée du terminal fait 2 méga octets. Ce même fichier peut varier entre 0 et 2 méga octets. il suffit que le fichier fasse 1 Mega et 1 octet et c'est foutu...
    Mais tu n'as pas a charger la totalite du fichier en memoire. Il te suffis de boucler sur les enregistrements et les lire un par un, modifier puis ecrire.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je ne comprends pas. Tu parles de mémoire centrale ou de mémoire sur disque ?

    Et ce n'est pas modifiable ? L'administrateur est manchot ou quoi ?
    Non, je me suis mal fait comprendre , c'est un terminal de type bancaire, ce n'est pas un pc. C'est un lecteur de carte à puce évolué programmable en C++ via un compilateur propriétaire. Il contient une mémoire Flash où sont stocké l'application et l'OS et une mémoiré SRAM de 2 méga où est stocké le fichier et qui sert de mémoire de travail. Cette valeur est inchangeable. C'est pour cela que le fichier doit etre le plus petit possible et encore moins en faire un double puis éffacer le désuet. Au moment du dédoublage, la mémoire risque d'être vite saturée.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Antoine.V
    Non, je me suis mal fait comprendre , c'est un terminal de type bancaire, ce n'est pas un pc. C'est un lecteur de carte à puce évolué programmable en C++ via un compilateur propriétaire. Il contient une mémoire Flash où sont stocké l'application et l'OS et une mémoiré SRAM de 2 méga où est stocké le fichier et qui sert de mémoire de travail. Cette valeur est inchangeable. C'est pour cela que le fichier doit etre le plus petit possible et encore moins en faire un double puis éffacer le désuet. Au moment du dédoublage, la mémoire risque d'être vite saturée.
    Il fallait peut être y penser avant ? On ne ne peut pas gérer un fichier de taille N si on a pas 2xN libre. C'est pas un scoop. Problème de conception... La réalisation ne peut pas regler les problèmes de conception. Aller secouer les puces de l'ingénieur qui a pondu cette merveille...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    C'est pour ca que je demandais si il n'éxiste pas d'autre méthode de suppression en C que de faire un double du fichier...

  10. #10
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Il y a donc "r+" et fseek() pour se promener dans le fichier mais cela demande pas mal d'operations d'I/O et c'est _extremement_ casse-gueule. Une erreur d'un octet dans la position demandee a fseek() et tu peux mettre le fichier a la poubelle... A utiliser avec precaution!

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/07/2010, 15h46
  2. Problème de suppression d'enregistrement dans un fichier vb6
    Par alighieri dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/06/2008, 11h51
  3. Suppression d'un enregistrement dans un fichier
    Par elhou80 dans le forum Pascal
    Réponses: 7
    Dernier message: 28/05/2007, 11h44
  4. Réponses: 7
    Dernier message: 23/07/2006, 17h11
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 15h17

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