Comment réduire un fichier en C ? Par exemple, si j'ouvre un fichier de 2 mégaoctets, que je fais un peu de travail et que je décide que seul 1 mégaoctet du fichier doit encore exister, comment cela est-il possible ? Je sais comment utiliser write( fd,....) pour écrire dans un fichier, mais que faire si je veux découper certaines parties au milieu d'un fichier ou le tronquer ?
Réponses
Trop de publicités?Presque tous les systèmes réels fournissent un moyen de tronquer un fichier, mais le standard C ne le fournit pas dans sa bibliothèque standard.
Cela signifie que tout ce que vous pouvez faire est de définir une fonction pour faire le travail, et d'implémenter cette fonction pour chaque cible qui vous intéresse (par exemple, sous Windows, elle appellera SetEndOfFile
sur les systèmes Unix-like, il appellera ftruncate
etc.).
Edit : juste pour clarifier : cela ne fonctionne que pour la partie "ou le tronquer" de la question. La plupart des systèmes de fichiers ne fournissent rien pour "découper certaines parties au milieu d'un fichier". Si vous voulez supprimer des éléments au milieu d'un fichier, vous devez généralement réécrire l'ensemble du fichier ou vous débrouiller tout seul. Dans ce dernier cas, il s'agit généralement d'une sorte de structure de type base de données dans laquelle vous ne supprimez pas réellement les données du milieu du fichier ; au lieu de cela, vous créez quelque chose comme un index qui indique l'emplacement des données qui vous intéressent et marque simplement les parties qui ne sont plus utilisées lorsque vous les supprimez. Ces parties peuvent ensuite être réutilisées si vous ajoutez des données ultérieurement. Dans certains cas, vous disposez d'une fonction de "compression" qui prend une telle base de données et la réécrit pour éliminer l'espace mort (mais là encore, vous devez réécrire le fichier).
Si le fichier est assez petit pour tenir dans la RAM, vous pouvez lire le fichier, et réécrire seulement les choses nécessaires (c'est-à-dire, lire le fichier, fermer le fichier, ouvrir le fichier à nouveau en mode écriture, écrire ce qui est nécessaire, fermer). Sinon, vous pouvez créer un second fichier, y écrire, puis supprimer le premier fichier et renommer le second.
Ce que je veux dire, c'est qu'il n'y a pas de moyen direct de supprimer une partie du fichier au milieu.
Si vous voulez préserver le contenu précédent du fichier jusqu'à une certaine longueur (une longueur supérieure à zéro), alors POSIX fournit les fonctions truncate() et ftruncate() pour cette tâche.
#include <unistd.h>
int ftruncate(int fildes, off_t length);
int truncate(const char *path, off_t length);
Le nom indique l'objectif principal - raccourcir un fichier. Mais si la longueur spécifiée est plus longue que la longueur précédente, le fichier grandit (sans remplissage) à la nouvelle taille. Notez que ftruncate() fonctionne sur un descripteur de fichier, et non sur un fichier de type FILE *;
que vous pourriez utiliser :
if (ftruncate(fileno(fp), new_length) != 0)
...la gestion des erreurs...
Il est probable, cependant, que pour vos besoins, la troncature à l'ouverture est tout ce dont vous avez besoin.
- Réponses précédentes
- Plus de réponses