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 :

fonction réduisant la taille d'un fichier


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut fonction réduisant la taille d'un fichier
    Bonjour,

    J'aimerai savoir quelle fonction ANSI permet de changer la taille d'un fichier ouvert avec un fopen

    genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FILE * f = fopen(etc...);
    fresize(f, nouvelleTailleduFichier);
    fclose(f);
    Merci de votre réponse

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Le fichier prends la place qu'il doit prendre et je ne crois pas que tu puisse jouer avec sa taille.
    Ce que tu peux faire c'est copier le fichier en mémoire, le modifier en mémoire puis le ré-écrire.

  3. #3
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    ca me parait bizarre qu'on ne puisse pas la réduire, étant donné qu'on peux l'augementer en l'ouvrant en mode ajout et en écrivant à la fin...

    de + sous C++ builder, une classe TFileStream offre une méthode permetant de fixer la longeur du fichier (en diminution comme en augmentation), donc je me dis qu'il doit y avoir une fonction en C dessous

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Mais comment veux-tu réduire la taille d'un fichier ??

    Si un fichier texte par exemple fait 1 ko c'est qu'il contient 1 ko de caractères. Tu peux pas diminuer la taille sans perdre des données


    Maintenant comme je t'ai dit tu peux l'ouvrir en mode ajout, charger le fichier en mémoire, réduire sa place en mémoire et le ré-écrire mais tu va FORCEMENT perdre des données !

  5. #5
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Je souhaites jsutement pouvoir perdre ces données là !!!

    et ca m'embeterait de devoir monter un fichier de 800 Mo en mémoire pour en réduire sa taille...

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    il est possible de changer la taille d'un fichier en utilisant une fonction de bas niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fileno(pointeur de fichier)
    puis on utilise la fonction chsize() mais c a confirmer. je confirmerai plus tard si necessaire

  7. #7
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut Aille
    Es-tu sûr que le fait de réduire sa taille va vraiment libérer la place sur le disque dur :

    Car sinon cela peut être un peu risqué.

  8. #8
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Citation Envoyé par Oldhar
    je confirmerai plus tard si necessaire
    C'est nécessaire !!

    car je ne la trouve pas dans le man

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 18
    Points : 22
    Points
    22
    Par défaut
    Tu as besoin d'accéeder au fichier une fois que tu l as réduit ?
    Sinon tu peux faire un "execve" de la commande "tar" ou "zip"

  10. #10
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    heu non, je ne veux pas le réduire dans le sens "compression de donnée" du terme, je veux tronquer le fichier en réduisant sa taille

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 18
    Points : 22
    Points
    22
    Par défaut
    Si j'ai bien compris tu veux ecraser ton fichier ? tu n'as donc plus besoin des données qui sont dedans ?
    Dans ce cas il doit y avoir une option d'ouverture pour OPEN() qui s'occupe de ca
    A confirmer

  12. #12
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Citation Envoyé par Fragonard
    Si j'ai bien compris tu veux ecraser ton fichier ?
    Non plus !

    mon fichier est de telle sorte que des données sont contenues dedans, qu'elles peuvent etre modifiées, supprimées etc... et il peut arriver que l'ensemble de données utile soit de taille moindre par rapport au fichier, à ce moment là, je veux pouvoir réajuster la taille du fichier à la taille exacte des données

  13. #13
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut si je comprends bien
    Si je comprends bien, c'est comme si tu avais un tableau de données, non plein et que du coup tu veuilles réduire sa taille sans le réallouer.

    Etant donné que cela ne me semble pas possible lorsqu'il est chargé en mémoire (nécessaire de faire un malloc, une copie, puis free) je ne pense pas que cela soit possible lorsque les données sont stockées sur le disque dur.

    Je pense que tu vas être obligé de le recopier petit à petit dans un autre fichier. C'est à dire que tant que tu as des données dans le premier fichier, tu les ajoutes au nouveau fichier. C'est sûr que ce n'est pas l'idéal avec des fichiers de 800 Mo.

  14. #14
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 694
    Points
    10 694
    Billets dans le blog
    3
    Par défaut
    A ma connaissance, ce n'est pas possibl en C ANSI. Il faut utiliser une fonction système spécifique a chaque OS.
    Ce que tu peux faire, c'est une fonction "standard" (qui recopie) que tu utilises par défaut et des fonctions alternatives en fonction des OS (que tu utilises ou non à l'aide de directives genre #ifdef _WIN32_).
    Sous Windows, positionne toi dans le fichier là où tu veux (avec fseek) puis appel SetEndOfFile.

  15. #15
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    OK, ca me débloque un peu
    même si SetEndOfFile() attend un Handle, au lieu d'un FILE, ce qui me fait chagner moulte choses...

    Il y a une fonction équivalente sous nunux ?

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    euh :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FILE * f;
    f = fopen("monfichier","monmode");
    int fd = fileno(f);
    Et voilà fd est un handle et tu n'a pas "moultes" chose à changer

  17. #17
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Harry_polin
    Je souhaites jsutement pouvoir perdre ces données là !!!

    et ca m'embeterait de devoir monter un fichier de 800 Mo en mémoire pour en réduire sa taille...
    Tout en conservant l'idee de recopier le fichier dans un autre, si tu ne souhaites pas charger l'integralite du fichier en memoire (ce qui n'est de toute mainere pas utile, puisqu'une partie des donnees ne t'interesse pas), tu peux lire le fichier par bloc de taille plus petite et ne recopier dans le fichier destination que les donnees utiles.
    Sur un gros fichier ca risque d'etre plutot long mais cette methode a l'avantage de ne pas dependre de l'OS utilise.

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    J'ai le meme besoin pour tronquer la fin d'un fichier.
    Si tu trouves une réponse cohérente en C ANSI , je serais infiniment
    reconnaissable.
    Merci d'avance

  19. #19
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Et voilà fd est un handle et tu n'a pas "moultes" chose à changer
    La question est justement que faut-il faire une fois qu'on a le handle ???


    pour la copie de gros fichier par blocs, oui j'y avais bien pensé, mais malheureusement il me faut de la rapidité...[/quote]

  20. #20
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Regarde les fonctions truncate() et ftruncate().

    #include <unistd.h>

    int truncate(const char *path, off_t length);
    int ftruncate(int fd, off_t length);

    DESCRIPTION
    Truncate causes the file named by path or referenced by fd to be truncated to at most length bytes in size. If the file
    previously was larger than this size, the extra data is lost. If the file previously was shorter, it is unspecified
    whether the file is left unchanged or is extended. In the latter case the extended part reads as zero bytes. With
    ftruncate, the file must be open for writing.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Taille d'un fichier par la fonction ftell
    Par SuperSeb95 dans le forum C
    Réponses: 6
    Dernier message: 11/05/2012, 15h35
  2. Ecrire dans un fichier en fonction de la taille des éléments
    Par michel42 dans le forum Général Python
    Réponses: 2
    Dernier message: 03/05/2012, 16h54
  3. XP recherche fichier fonction de la taille
    Par VlaMonPseudo dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/12/2010, 20h45
  4. Réponses: 3
    Dernier message: 13/09/2007, 11h45

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