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 ou supprimer des octets à la positions i


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 60
    Points : 107
    Points
    107
    Par défaut Tronquer un fichier ou supprimer des octets à la positions i
    Bonjour,

    Je sais me positionner dans un fichier à l'aide de fonction seek et tell (respectivement seekg, seekp, tellg, tellp), je sais écraser des valeurs dans un fichier, mais est-ce qu'il y a un moyen pour tronquer un fichier, c'est à dire enlever les n derniers octets sans passer par la copie dans un autre fichier ? Mieux encore est-ce qu'il y a moyen de supprimer un certain nombre d'octet sur une position donné ?

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    14 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 14 872
    Points : 34 596
    Points
    34 596
    Par défaut
    truncate ou ftruncate si tu passes le handle du fichier.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    1 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 1 335
    Points : 6 482
    Points
    6 482
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    truncate ou ftruncate si tu passes le handle du fichier.
    En fait sont des fonctions POSIX, elles ne sont pas dans la bibliothèque standard.
    Si tu n'es pas sous POSIX:
    Tu as depuis l C++17, la fonction std::filesystem::resize_file().
    Sinon avant, il te faudra ré-écrire le fichier avec le flag std::ios_base::openmode::trunc.

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    14 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 14 872
    Points : 34 596
    Points
    34 596
    Par défaut
    oui tu as raison, j'avais pas fait attention que c'était du C++, j'avais vu fseek.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 60
    Points : 107
    Points
    107
    Par défaut
    J'ai aussi trouver bool QFile::resize(qint64 sz) et bool QFile::resize(const QString &fileName, qint64 sz).
    En tout cas merci beaucoup pour vos aides.

  6. #6
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    mai 2007
    Messages
    981
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mai 2007
    Messages : 981
    Points : 1 971
    Points
    1 971
    Par défaut
    Fais attention, QFile est une implémentation Qt, ce n'est pas standard
    Homer J. Simpson


  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    avril 2019
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2019
    Messages : 60
    Points : 107
    Points
    107
    Par défaut
    Merci pour l'info, j'avoue que l'idéal est une fonction de la bibliothèque standard, d'ailleurs ça m'étonne qu'il a fallu attendre c++17 pour avoir une implémentation de resize_file (dans la bibliothèque standard).

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    octobre 2004
    Messages
    11 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 511
    Points : 29 908
    Points
    29 908
    Par défaut
    Salut,
    Citation Envoyé par baragouine Voir le message
    Merci pour l'info, j'avoue que l'idéal est une fonction de la bibliothèque standard, d'ailleurs ça m'étonne qu'il a fallu attendre c++17 pour avoir une implémentation de resize_file (dans la bibliothèque standard).
    Je peux comprendre ta surprise, et pourtant...

    Le fait est qu'il n'y a -- a priori -- absolument pas besoin de ce genre de fonction

    Car, si on remonte aux origines de l'informatique, les fichiers étaient enregistré sur des bandes magnétiques, que l'on pourrait assimiler à de bonnes vieilles cassettes audio: chaque byte prenait un espace bien particulier (mettons: x millimètres) sur la bande il était impossible d'effacer un byte particulier tout en gardant tous les bytes qui précèdent et ceux qui suivent:

    On pouvait -- éventuellement -- donner à un byte que l'on voulait annuler une valeur qui indiquait "ceci est un byte annulé" (255), mais, si on voulait vraiment supprimer un byte (et "récupérer" son espace sur la bande magnétique), il fallait purement et simplement réécrire l'ensemble des bytes qui suivaient en les décalant de l'espace adéquat.

    Autrement dit, les fichiers "gravés dans la pierre": on pouvait éventuellement rajouter des informations en fin de fichier, mais si on voulait modifier le contenu "existant" du fichier, la seule solution consistait à ... casser la pierre et à réécrire l'ensemble.

    Note que, par la suite, lorsque les disques durs sont apparus, le problème n'a pas été réglé pour autant: au lieu d'avoir une longue bande magnétique, les disques durs étaient composés de "plateaux" tournant sur eux même, chaque plateau étant divisé en "un certain nombre" de cylindres, chaque cylindre étant lui-même composé d'un certain nombre de "clusters" correspondant à l'espace parcourru par le plateau en dessous de la tête de lecture en un certain temps et pouvant typiquement contenir 512 bytes chacun

    Le cluster étant l'unité de base utilisée pour l'adressage (pour savoir ce qui se trouve où cela sur le disque dur), la taille d'un fichier était forcément un multiple de 512 (car les clusters étaient indivisibles) et au moins suffisante que pour permettre de contenir l'ensemble des informations que l'on mettait dans le fichier).

    Les disques durs SSD n'ont pas changé la donne sur ce point, car il y a toujours le problème d'être en mesure de déterminer sur "quelle partie du disque dur" se trouve le fichier auquel on souhaite accéder, et, par conséquent, de la taille du fichier auquel on souhaite accéder.

    Toujours est-il que, si tu ne veux pas effacer les derniers octets de ton fichier, la réduction de taille de ton fichier passera par le fait de réécrire l'ensemble du fichier auquel on aura retiré les informations devenues inutiles.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. [Batch] Dans un fichier TxT, supprimer des lignes si vide après un délimiteur.
    Par JRBBT dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 13/11/2017, 08h30
  2. macro vba pour comparer des fichiers et supprimer des lignes
    Par romanzolanski dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/07/2016, 08h04
  3. [Batch] Ré écrire un fichier en supprimant des lignes
    Par nekcorp dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 16/11/2012, 12h49
  4. Comment supprimer des fichiers en nombre ?
    Par Didier L dans le forum API, COM et SDKs
    Réponses: 13
    Dernier message: 25/01/2005, 17h01
  5. Shell pour supprimer des lignes d'un fichier
    Par nelsa dans le forum Autres langages
    Réponses: 2
    Dernier message: 20/09/2004, 13h26

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