Como truncar um arquivo em C?

Estou usando C para gravar alguns dados em um arquivo. Eu quero apagar o texto anterior escrito no arquivo no caso de ser mais longo do que o que estou escrevendo agora. Eu quero diminuir o tamanho do arquivo ou truncar até o final. Como posso fazer isso?

Se você quiser preservar o conteúdo anterior do arquivo até algum tamanho (um tamanho maior que zero, que outras respostas fornecem), então o POSIX fornece as funções truncate() e ftruncate() para o job.

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

O nome indica o objective principal – encurtar um arquivo. Mas se o comprimento especificado for maior que o comprimento anterior, o arquivo aumentará (preenchimento zero) para o novo tamanho. Note que ftruncate() trabalha em um descritor de arquivo, não em um FILE * ; você poderia usar:

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

No entanto, você deve estar ciente de que misturar o stream de arquivos ( FILE * ) e o access do descritor de arquivos ( int ) a um único arquivo pode causar confusão – veja os comentários de alguns dos problemas. Este deveria ser um último recurso.

É provável, no entanto, que, para seus propósitos, truncar em aberto seja tudo o que você precisa e, para isso, as opções dadas por outros serão suficientes.


Para o Windows, existe uma function SetEndOfFile() e uma function relacionada SetFileValidData() que pode fazer uma tarefa semelhante, mas usando uma interface diferente. Basicamente, você procura onde deseja definir o final do arquivo e depois chama a function.

Há também uma function _chsize() conforme documentada na resposta por sofr .

Nos sistemas Windows, não há header mas você pode truncar um arquivo usando

  _chsize( fileno(f), size); 

Essa é uma function do seu sistema operacional. A maneira padrão POSIX para fazer isso é:

 open("file", O_TRUNC | O_WRONLY); 

Se isso for executado sob algum tipo de UNIX, essas APIs devem estar disponíveis:

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

De acordo com o “homem truncado” na minha checkbox Linux, estes são compatíveis com POSIX. Observe que essas chamadas aumentarão o tamanho do arquivo (!) Se você passar um comprimento maior que o tamanho atual.

Se você quiser truncar o arquivo inteiro, abrir o arquivo para gravação faz isso para você. Caso contrário, você terá que abrir o arquivo para leitura e ler as partes do arquivo que deseja manter em uma variável temporária e, em seguida, enviá-lo para onde você precisar.

Truncar o arquivo inteiro:

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

Truncar parte do arquivo:

 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, você editou o seu post, você está usando o C. Quando você abrir o arquivo, abra-o com o modo “w +”, e ele irá truncá-lo para escrever:

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

Para truncar um arquivo em C ++, você pode simplesmente criar um object ofstream para o arquivo, usando ios_base :: trunc como o modo de arquivo para truncá-lo, assim:

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