Cómo truncar un archivo en C?


Estoy usando C para escribir algunos datos en un archivo. Quiero borrar el texto anterior escrito en el archivo en caso de que fuera más largo de lo que estoy escribiendo ahora. Quiero disminuir el tamaño del archivo o truncar hasta el final. ¿Cómo puedo hacer esto?

 39
Author: Jonathan Leffler, 2009-05-17

6 answers

Si desea conservar el contenido anterior del archivo hasta una longitud (una longitud mayor que cero, que otras respuestas proporcionan), POSIX proporciona las funciones truncate() y ftruncate() para el trabajo.

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

El nombre indica el propósito principal - acortar un archivo. Pero si la longitud especificada es más larga que la longitud anterior, el archivo crece (relleno cero) al nuevo tamaño. Tenga en cuenta que ftruncate() funciona en un descriptor de archivo, no en un FILE *; podría usar:

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

Sin embargo, debe tener en cuenta que mezclar flujo de archivo (FILE *) y descriptor de archivo (int) el acceso a un solo archivo puede llevar a confusión - vea los comentarios para algunos de los problemas. Este debería ser el último recurso.

Es probable, sin embargo, que para sus propósitos, truncar en abierto es todo lo que necesita, y para eso, las opciones dadas por otros serán suficientes.


Para Windows, hay una función SetEndOfFile() y una función relacionadaSetFileValidData() función que puede hacer un trabajo similar, pero usando una interfaz diferente. Básicamente, busca donde desea establecer el final del archivo y luego llamar a la función.

También hay una función _chsize() como se documenta en la respuesta de sofr.

 63
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-21 19:27:52

En los sistemas Windows no hay encabezado <unistd.h> pero aún así puede truncar un archivo usando

 _chsize( fileno(f), size);
 21
Author: sofr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-13 17:47:39

Esa es una función de su sistema operativo. La forma POSIX estándar de hacerlo es:

open("file", O_TRUNC | O_WRONLY);
 12
Author: pixelbeat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-21 19:48:41

Si esto se va a ejecutar bajo algún tipo de UNIX, estas API deberían estar disponibles:

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

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

De acuerdo con el "truncado man" en mi caja Linux, estos son conformes a POSIX. Tenga en cuenta que estas llamadas realmente aumentarán el tamaño del archivo (!) si pasa una longitud mayor que la longitud actual.

 5
Author: Lance Richardson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-17 00:54:41

Si desea truncar el archivo completo, abrir el archivo para escribir lo hace por usted. De lo contrario, debe abrir el archivo para leer y leer las partes del archivo que desea mantener en una variable temporal, y luego enviarlo a donde sea necesario.

Trunca el archivo completo:

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

Trunca parte del archivo:

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
Author: DeadHead,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-19 22:06:18

Ah, editaste tu post, estás usando C. Cuando abras el archivo, ábrelo con el modo "w+" así, y lo truncará listo para escribir:

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

Para truncar un archivo en C++, puede crear un objeto ofstream para el archivo, usando ios_base::trunc como el modo de archivo para truncar, así:

ofstream x("C:\\gabehabe.txt", ios_base::trunc);
 3
Author: gabehabe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-17 00:39:24