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

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

 #include  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ías usar:

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

Sin embargo, debe tener en cuenta que mezclar el flujo de archivos ( FILE * ) y el descriptor de archivo ( int ) el acceso a un único archivo puede generar confusión: consulte los comentarios sobre algunos de los problemas. Esto debería ser un último recurso.

Sin embargo, es probable que para sus propósitos, truncar al abrir sea 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 relacionada SetFileValidData() función que puede hacer un trabajo similar, pero utilizando una interfaz diferente. Básicamente, busca dónde desea establecer el final del archivo y luego llama a la función.

También hay una función _chsize() como está documentado en la respuesta de sofr .

En los sistemas de Windows, no hay encabezado pero aún puede truncar un archivo mediante el uso de

  _chsize( fileno(f), size); 

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

 open("file", O_TRUNC | O_WRONLY); 

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

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

De acuerdo con el “hombre truncado” en mi caja de Linux, estos son POSIX-conforme. Tenga en cuenta que estas llamadas boostán realmente el tamaño del archivo (!) Si pasa una longitud mayor que la longitud actual.

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

Truncar todo el archivo:

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

Truncar 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. 

Ah, editaste tu publicación, estás usando C. Cuando abres el archivo, ábrelo con el modo “w +” como tal, y lo truncará listo para escribir:

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

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

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