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 cela?

39
demandé sur Jonathan Leffler 2009-05-17 02:28:28

6 réponses

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

#include <unistd.h>
int ftruncate(int fildes, off_t length);
int truncate(const char *path, off_t length);

Le nom indique le but principal-raccourcir un fichier. Mais si la longueur spécifiée est plus longue que la longueur précédente, le fichier grandit (remplissage zéro) à 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 le flux de fichiers (FILE *) et le descripteur de fichier (int) à un seul fichier est susceptible de créer de la confusion - voir les commentaires pour certains des problèmes. Ce devrait être un dernier recours.

, Il est probable, cependant, que pour vos besoins, tronquer sur ouvrir est tout ce dont vous avez besoin, et pour cela, les options fournies par d'autres seront suffisantes.


Pour Windows, il existe une fonction SetEndOfFile() et une fonction liée à l'SetFileValidData() fonction de ce que peut faire un emploi similaire, mais en utilisant une interface différente. Fondamentalement, vous cherchez à l'endroit où vous voulez définir la fin du fichier, puis appelez la fonction.

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

63
répondu Jonathan Leffler 2018-06-21 19:27:52

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

 _chsize( fileno(f), size);
21
répondu sofr 2016-04-13 17:47:39

C'est une fonction de votre système d'exploitation. La façon standard de le faire est POSIX:

open("file", O_TRUNC | O_WRONLY);
12
répondu pixelbeat 2014-03-21 19:48:41

Si cela doit fonctionner sous une certaine saveur D'UNIX, ces API devraient ê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 vont effectivement augmenter la taille du fichier (!) si vous passez une longueur supérieure à la longueur actuelle.

5
répondu Lance Richardson 2009-05-17 00:54:41

Si vous voulez tronquer le fichier entier, ouvrir le fichier pour l'écriture le fait pour vous. Sinon, vous devez ouvrir le fichier pour la lecture et lire les parties du fichier que vous souhaitez conserver dans une variable temporaire, puis le sortir où vous le souhaitez.

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.
4
répondu DeadHead 2011-10-19 22:06:18

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

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

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

ofstream x("C:\\gabehabe.txt", ios_base::trunc);
3
répondu gabehabe 2009-05-17 00:39:24