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 :

tronquer un fichier ?


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Par défaut [résolu] tronquer un fichier ?
    Salut à tous !

    J'ai un tout petit tout petit disque dur et pas beaucoup de mémoire.

    J'ai un fichier qui comporte des données binaires.

    J'aimerai retirer (dans le sens "supprimer" et non pas dans le sens "lire") des octets de ce fichier. Octets se trouvant au milieu du fichier...

    Savez-vous qomment je peux faire ça ?

    Je précise que je n'ai pas les moyens de copier l'intégralité du fichier dans un buffer tampon puis de recreer le fichier... ni de creer un autre fichier à coté.

    Merci,
    Jbat.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 92
    Par défaut
    Pourtant c'est la seule solution pour supprimer des données dans un fichier : le recopier sans les données à supprimer.

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Par défaut
    si tu es trés limité en place sur le disque, il y a une méthode qui est trés lente mais qui ne t'oblige pas a creer un autre fichier.
    Il faut decaler les données qui se trouve aprés les blocs que tu veux supprimer.

    Ex:
    voila le contenu de ton fichier:
    0 1 2 3 4 5 6 7 8 9
    tu veut retirer le 6 et le 7
    0 1 2 3 4 5 7 8 9 /* on ecrase le 6 par le 7, le 7 par le 8... */
    => on a supprime le 6
    0 1 2 3 4 5 8 9 /* on ecrase le 7 par le 8, le8 par le 9 */
    => on supprime le 7

    si tu as assez de memoire, essais de deplacer des blocs de la taille de ton bloc a supprimer.

    mais cette technique t'oblige a faire beaucoup d'acces disque et sera donc trés lente...

  4. #4
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    tu peux aussi charger ce fichier directement en mémoire
    travailler sur le Buffer

    Sauvegarde le contenu de ton Buffer sur ton disque avec le nom de ton ancien fichier

    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Par défaut
    Merci à tous pour vos suggestions.

    En effet, la méthode que j'ai commencé à implémenter est celle du décallage d'octets un par un (bloc d'octets par bloc d'octets pour aller plus vite) (la seule méthode utilisable - du moins à ma connaissance) mais contrairement à ce que dis Sylvain114d, on ne passe pas de

    1 2 3 4 5 6 7 8 9
    à
    1 2 3 4 5 7 8 9
    puis à
    1 2 3 4 5 8 9

    mais de
    1 2 3 4 5 6 7 8 9
    à
    1 2 3 4 5 7 8 9 9
    puis à
    1 2 3 4 5 8 9 9 9

    C'est là mon problème. Il faudrai que je puisse tronquer après le premier 9, les autres n'étant que des "vestiges" de l'ancien fichier.

    En cherchant bien, j'ai fini par trouver une méthode appelée :
    chsize(int handle, long size)

    Cette méthode semble convenir à ce que je veux faire à une exception près. Elle ne fonctionne qu'avec les fichiers ouverts avec des handle (et donc avec la fonction open). J'ai utilisé la méthode fopen qui, elle, ne retourne pas (à ma connaissance) de handle.

    Est-il possible selon vous de récupérer après coup ce handle ? Ou dois-je revoir ma méthode d'ouverture de fichier (je ne maitrise pas trop "open" alors que je connais bien "fopen")

    Merci encore.

  6. #6
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 842
    Par défaut
    Une question en passant : sur quel type de machine travailles-tu ? Car pour que tu ne puisses pas charger ton fichier en mémoire ou le recopier sur disque, soit c'est un TRES gros fichier, soit c'est une machine vraiment TRES limitée, genre un truc embarqué ?

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez à consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.

    Je n'ai rien à voir avec la société www.ovh.com !

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Par défaut
    En fait, c'est un peu des deux...

    C'est en effet une machine embarquée avec très peu d'espace disque disponible et un très gros fichier qui est susceptible de prendre potentiellement tout l'espace disque disponible (genre 2Mo, ou là là que c'est gros ! )

  8. #8
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    . Pour tronquer, tu as ....... troncate ! ! Par contre elle travaille sur le fichier ferme a priori (tu lui passe le chemin et la taille).
    . j'ai pas trouve ta fonction chsize (sous linux)
    . si tu n'as pas de fprintf... tu peux passer a open/ftruncate (qui bien que son nom commence par f travaille sur un handle et non sur un FILE *).

  9. #9
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 842
    Par défaut
    Arf, ok ! :o

    Evidemment à ce moment-là... je comprends. As-tu envisagé de coder en assembleur ???... La ça réduit encore la taille du code et donc augmente la place disponible Non mais si c'est un programme complexe c'est clair que le C est plus facile !

    Bon courage

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez à consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.

    Je n'ai rien à voir avec la société www.ovh.com !

  10. #10
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Citation Envoyé par jbat
    Cette méthode semble convenir à ce que je veux faire à une exception près. Elle ne fonctionne qu'avec les fichiers ouverts avec des handle (et donc avec la fonction open). J'ai utilisé la méthode fopen qui, elle, ne retourne pas (à ma connaissance) de handle.
    Est-il possible selon vous de récupérer après coup ce handle ? Ou dois-je revoir ma méthode d'ouverture de fichier (je ne maitrise pas trop "open" alors que je connais bien "fopen")
    On peut faire le contraire: récupérer un flux à partir d'un fichier ouvert avec open, mais pas le contraire.

    Ceci dit, l'ouverture avec open est très simple.
    Voilà un petit exemple (codé sous Unix)
    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
     
    /* Affichage a l'ecran du contenu d'un fichier dont le nom est passe en parametre */
     
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(int argc, char** argv){
      int fd, nb;
      char buf[512];
      if (argc!=2) {
        write(2, "Nb arguments incorrect\n",30);
        exit(1);
      }
      if ((fd=open(argv[1], O_RDONLY))==-1) {
        perror("Ouverture");
        exit(1);
      }
      while((nb=read(fd, buf, sizeof(buf)))>0) {
    	write(1,buf,nb);
    	}
      close(fd);
      return(0);
    }

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Par défaut
    Citation Envoyé par D[r
    eadLock]. Pour tronquer, tu as ....... troncate ! ! Par contre elle travaille sur le fichier ferme a priori (tu lui passe le chemin et la taille).
    . j'ai pas trouve ta fonction chsize (sous linux)
    . si tu n'as pas de fprintf... tu peux passer a open/ftruncate (qui bien que son nom commence par f travaille sur un handle et non sur un FILE *).

    Moi, je n'ai pas trouvé ta fonction "truncate" qui pourtant aurait été parfaite pour ce que je veux faire. Je pense donc que nous n'utilisons pas les mêmes librairies.
    J'utilise un bon vieux Borland turboC sous dos...

  12. #12
    Membre chevronné
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Sous Borland chsize() fait bien ce que tu veux et est portable Win32.
    Utilise la en sachant bien que ca ne marchera pas sous Unix.

    Pour l'exemple que je t'ai donné, remplace la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include <unistd.h>
    par
    Si tu as besoin d'aide dans les fonctions open(), read(), write(), envoie nous ton code!

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 190
    Par défaut
    Merci pour l'exemple.

    En effet, avec le fonction open, qui n'est pas plus dure à manipuler que fopen, j'ai un handle que je peux utiliser pour tronquer mon fichier à l'aide de la fonction chsize.

    Merci à tous pour votre aide.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Tronquer un nom de fichier
    Par aerane dans le forum Scripts/Batch
    Réponses: 20
    Dernier message: 21/05/2013, 08h22
  2. Tronquer un fichier
    Par teddyalbina dans le forum Framework .NET
    Réponses: 1
    Dernier message: 18/06/2012, 15h44
  3. Problemes pour tronquer un fichier de Log
    Par toxycyty dans le forum Administration
    Réponses: 2
    Dernier message: 08/07/2009, 16h45
  4. Tronquer un fichier déjà ouvert
    Par Médinoc dans le forum POSIX
    Réponses: 5
    Dernier message: 20/02/2009, 11h36
  5. [RegEx] Lire, tronquer et afficher un fichier txt
    Par furtif1 dans le forum Langage
    Réponses: 3
    Dernier message: 22/05/2007, 14h35

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