Bonjour,
J'aimerai savoir quelle fonction ANSI permet de changer la taille d'un fichier ouvert avec un fopen
genre
Merci de votre réponseCode:
1
2
3 FILE * f = fopen(etc...); fresize(f, nouvelleTailleduFichier); fclose(f);
Version imprimable
Bonjour,
J'aimerai savoir quelle fonction ANSI permet de changer la taille d'un fichier ouvert avec un fopen
genre
Merci de votre réponseCode:
1
2
3 FILE * f = fopen(etc...); fresize(f, nouvelleTailleduFichier); fclose(f);
8O 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.
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
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 !
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...
il est possible de changer la taille d'un fichier en utilisant une fonction de bas niveaupuis on utilise la fonction chsize() mais c a confirmer. je confirmerai plus tard si necessaireCode:fileno(pointeur de fichier)
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é. :!:
C'est nécessaire !! :DCitation:
Envoyé par Oldhar
car je ne la trouve pas dans le man
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"
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
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
Non plus !Citation:
Envoyé par Fragonard
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
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.
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.
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 ?
euh :
Et voilà fd est un handle et tu n'a pas "moultes" chose à changer :wink:Code:
1
2
3
4 FILE * f; f = fopen("monfichier","monmode"); int fd = fileno(f);
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.Citation:
Envoyé par Harry_polin
Sur un gros fichier ca risque d'etre plutot long mais cette methode a l'avantage de ne pas dependre de l'OS utilise.
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
La question est justement que faut-il faire une fois qu'on a le handle ???Citation:
Et voilà fd est un handle et tu n'a pas "moultes" chose à changer :wink:
pour la copie de gros fichier par blocs, oui j'y avais bien pensé, mais malheureusement il me faut de la rapidité...[/quote]
Regarde les fonctions truncate() et ftruncate().
Citation:
#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.