web-dev-qa-db-fra.com

Comment tronquer un fichier en C?

J'utilise C pour écrire des données dans un fichier. Je veux effacer le texte précédent écrit dans le fichier au cas où il serait plus long que ce que j'écris maintenant. Je veux diminuer la taille du fichier ou tronquer jusqu'à la fin. Comment puis-je faire ceci?

43
sofr

Dans les systèmes Windows, il n'y a pas d'en-tête <unistd.h> mais vous pouvez néanmoins tronquer un fichier en utilisant

 _chsize( fileno(f), size);
22
sofr

Si vous souhaitez conserver le contenu précédent du fichier jusqu'à une certaine longueur (une longueur supérieure à zéro, que d'autres réponses fournissent), alors POSIX fournit les fonctions truncate() et ftruncate() pour le emploi.

#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 s'agrandit (remplissage nul) à la nouvelle taille. Notez que ftruncate() fonctionne sur un descripteur de fichier, pas un FILE *; vous pourriez utiliser:

if (ftruncate(fileno(fp), new_length) != 0) ...error handling...

Cependant, vous devez savoir que mélanger l'accès au flux de fichiers (FILE *) Et au descripteur de fichier (int) à un seul fichier est susceptible de prêter à confusion - voir les commentaires pour certains des problèmes. Cela devrait être un dernier recours.

Il est probable, cependant, que pour vos besoins, tronquer à l'ouverture soit tout ce dont vous avez besoin, et pour cela, les options données par d'autres seront suffisantes.


Pour Windows, il existe une fonction SetEndOfFile() et une fonction associée SetFileValidData() qui peut effectuer un travail similaire, mais en utilisant un interface différente. Fondamentalement, vous recherchez l'endroit où vous souhaitez définir la fin du fichier, puis appelez la fonction.

Il y a aussi une fonction _chsize() comme documentée dans le réponse par sofr .

70
Jonathan Leffler

C'est une fonction de votre système d'exploitation. La manière standard de le faire avec POSIX est:

open("file", O_TRUNC | O_WRONLY);
12
pixelbeat

Si cela doit s'exécuter sous une certaine saveur d'UNIX, ces API doivent être disponibles:

   #include <unistd.h>
   #include <sys/types.h>

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

Selon le "man truncate" sur ma boîte Linux, ceux-ci sont conformes à POSIX. Notez que ces appels augmenteront réellement la taille du fichier (!) Si vous passez une longueur supérieure à la longueur actuelle.

8
Lance Richardson

Si vous souhaitez tronquer l'intégralité du fichier, l'ouvrir pour l'écriture le fait pour vous. Sinon, vous devez ouvrir le fichier en lecture et lire les parties du fichier que vous souhaitez conserver dans une variable temporaire, puis le publier à l'endroit où vous en avez besoin.

Tronquer le fichier entier:

FILE *file = fopen("filename.txt", "w"); //automatically clears the entire file for you.

Tronquer une partie du fichier:

FILE *inFile("filename.txt", "r");
//read in the data you want to keep
fclose(inFile);
FILE *outFile("filename.txt", "w");
//output back the data you want to keep into the file, or what you want to output.
3
DeadHead

<edit>

Ah, vous avez édité votre message, vous utilisez C. Lorsque vous ouvrez le fichier, ouvrez-le avec le mode "w +" comme ça, et il le tronquera prêt pour l'écriture:

FILE* f = fopen("C:\\gabehabe.txt", "w+");
fclose(file);

</edit>

Pour tronquer un fichier en C++, vous pouvez simplement créer un objet ofstream vers le fichier, en utilisant ios_base :: trunc comme mode de fichier pour le tronquer, comme ceci:

ofstream x("C:\\gabehabe.txt", ios_base::trunc);
2
Danny Battison