2009-05-16 73 views
38

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?Cómo truncar un archivo en C?

Respuesta

19

En los sistemas Windows no hay cabecera <unistd.h> pero aún se puede truncar un archivo utilizando

_chsize(fileno(f), size); 
+5

_chsize_s para 64 bit: _chsize_s (_fileno (f), tamaño); – Gyuri

+0

_fileno funciona realmente ayuda si usamos la estructura FILE – Carthi

+0

¿No es una función solo de MS-Windows? –

12

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

open("file", O_TRUNC | O_WRONLY); 
+6

Este trunca el archivo a un tamaño de 0 bytes. – chmike

4

Si desea truncar el archivo completo, abrir el archivo para escritura lo hace por ti. 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. 

parte Truncar 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. 
+5

Esta es una forma muy ineficiente de realizar esto. El método de @Jonathan Leffler es mucho más preferible, y si su plataforma no lo permite, al menos realice un ciclo de escritura/cambio de nombre para evitar daños en caso de caída (copie los datos en un nuevo archivo con el nombre temporal, luego cambie los nombres (atomicly si es posible), luego borre el archivo anterior) – derobert

3

< edición >

Ah, que ha editado su mensaje, usted está utilizando C. Cuando abra el archivo, ábralo con el modo "w +" como tal, y lo truncará listo para escribir:

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

</editar >

Para truncar un archivo en C++, sólo tiene que crear un objeto ofstream al archivo, usando ios_base :: trunc como el modo de archivo para truncar ella, de este modo:

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

fopen truncará el contenido del archivo "gabehabe.txt" y posicionará el puntero del archivo al inicio, ¿no? ¿Va a vaciar el contenido del archivo antes de volver a colocar el puntero del archivo? – Arpith

58

Si desea conservar el contenido anterior del archivo hasta cierta extensión (una longitud mayor que cero, lo que otros proporcionan respuestas), entonces P OSIX 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 *; que puede usar:

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

Sin embargo, debe tener en cuenta que la mezcla de flujo de archivos (FILE *) y el descriptor de archivo (int) el acceso a un solo archivo es apto para llevar a confusión - ver los comentarios de algunos de los temas . Esto debería ser un último recurso.

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

+0

Dos minutos por delante ... ¡Bien! –

+0

¡Remarcablemente similar, Lance! Al menos uno de nosotros probablemente obtuvo la información correcta. (Se supone que el uso de no es necesario en los estándares POSIX más recientes, por seguridad, no hace daño, sin embargo). –

+1

¿Existe tal función en C++ vs 2003 que no pude encontrar? no incluye ¿me ayudó algo? No quiero abrir el archivo con w pero use el archivo abierto ya – sofr

5

Si esto es para ejecutarse en un cierto sabor de UNIX, estas API deben 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 "hombre truncado" en mi máquina Linux, estos son conformes con POSIX. Tenga en cuenta que estas llamadas aumentarán realmente el tamaño del archivo (!) Si pasa una longitud mayor que la longitud actual.