Tronquer le fichier

J’utilise fopen fseeko64 ftello64 ​​fclose etc. pour opérer sur un fichier.

Comment puis-je tronquer un fichier? Je sais qu’il n’y a pas de moyen standard de le faire en C. Tout ce que je veux, c’est une façon de travailler sur n’importe quelle plate-forme win32. J’utilise mingw gcc pour comstackr.

S’il vous plaît noter: je voulais dire tronquer la taille du fichier à une taille spécifiée, pas faire la taille 0. Et utiliser un truc comme copier une partie dans un autre fichier et supprimer / renommer n’est pas approprié.

SetEndOfFile ()

Obtenez un handle pour le fichier avec un access en écriture, définissez le pointeur de fichier, puis appelez SetEndOfFile ().

-Adam

Si vous souhaitez tronquer le fichier à la taille zéro, vous pouvez fopen le drapeau "w" :

 FILE *fh = fopen("file.txt","w"); if (fh != NULL) fclose(fh); 

Pour tronquer à une taille spécifique en C standard, vous pouvez le faire avec une solution de transfert / renommer, par exemple:

 FILE *finp = fopen ("inp.txt", "rb"); // should check for NULLs FILE *fout = fopen ("out.txt", "wb"); size_t sz = 100000; // 100,000 bytes char *buff = malloc (sz); // should check for NULL sz = fread (buff, 1, sz, fin); // should check for errors fwrite (buff, 1, sz, fout); free (buff); fclose (fin); fclose (fout); rename ("out.txt", "inp.txt); // should check for error 

Bien sûr, si vous avez access aux en-têtes et aux bibliothèques Win32 (et je crois que MinGW vous en donne), vous pouvez utiliser SetEndOfFile() car il le fait plutôt que de créer un nouveau fichier et de le renommer.

Cela signifie qu’il faut utiliser les E / S de fichiers Windows basées sur les descripteurs plutôt que les fichiers C FILE* , mais si vous vous limitez à Windows de toute façon, cela n’a pas d’importance. Si vous voulez la portabilité, vous aurez besoin d’une solution basée sur le standard C, telle que la solution de transfert / renommer ci-dessus.

Pour les opérations de fichiers basées sur FILE, utilisez _fileno () et _chsize_s () pour modifier la taille d’un fichier.

 int changesize(FILE *fp, __int64 size) { int filedes = _fileno(fp); return _chsize_s(filedes, size); } 

Une version tronquée peut être écrite en validant que la taille fournie est inférieure à la taille actuelle du fichier, car _chsize_s () tronquera ou étendra la taille d’un fichier – voir http://msdn.microsoft.com/en-us/library/whx354w1 (VS.80) .aspx .

Si vous fopen() simplement un fichier avec l’argument "w" , il sera tronqué.

http://www.cplusplus.com/reference/clibrary/cstdio/fopen.html

Comme déjà mentionné, vous pouvez utiliser fopen () avec l’indicateur “w” comme:

 FILE *f = fopen("file.txt", "w"); 

De plus, si le fichier est déjà ouvert, vous pouvez utiliser la fonction freopen (), à nouveau avec le drapeau “w”:

 FILE *f = fopen("file.txt", "r"); //initial fopen() call ... f = freopen("file.txt", "w", f); //reopens "file.txt" and truncates it 

http://www.cplusplus.com/reference/clibrary/cstdio/freopen.html

EDIT: Après avoir vu que vous avez édité votre OP, je ne republierai pas ce que Pax et Adam Davis ont déjà mis. Je confirme également ce que Pax a dit, à savoir que le MinGW vous donne access aux en-têtes Win32.