2012-10-19 16 views
5

Il mio codice attualmente simile a questa (questi passaggi suddivise in molteplici funzioni):chiaro/troncare file in C, quando già aperto in modalità "R +"

/* open file */ 
FILE *file = fopen(filename, "r+"); 

if(!file) { 

    /* read the file */ 

    /* modify the data */ 

    /* truncate file (how does this work?)*/ 

    /* write new data into file */ 

    /* close file */ 
    fclose(file); 
} 

So che avrei potuto aprire il file con in "w" modalità, ma non voglio farlo in questo caso. So che esiste una funzione ftruncate in unistd.h/sys/types.h, ma non voglio usare queste funzioni il mio codice dovrebbe essere altamente portatile (anche su Windows).

Esiste la possibilità di cancellare un file senza chiuderlo/riaprirlo?

risposta

4

Con standard C, l'unico modo è riaprire il file in modalità "w +" ogni volta che è necessario troncare. È possibile utilizzare freopen() per questo. "w +" continuerà a consentire la lettura da esso, quindi non è necessario chiudere e riaprire ancora in modalità "r +". La semantica di "w +" è:

Aperto per lettura e scrittura. Il file viene creato se non esiste, altrimenti viene troncato. Lo stream è posizionato all'inizio del file.

(tratto dal fopen (3) pagina man.)

è possibile passare un puntatore NULL come il parametro nome del file quando si usa freopen():

my_file = freopen(NULL, "w+", my_file); 

Se non è necessario leggi ancora dal file, quando anche la modalità "w" andrà bene.

+1

OP desidera una soluzione indipendente dalla piattaforma e non desidera riaprire il file. E usa ancora r +. :) – askmish

+0

@askmish Che non è possibile :-P –

+0

@Nkos: È possibile, ma la soluzione ottimale sarebbe davvero complessa (che coinvolge le chiamate del kernel, utilizzando meccanismi bufferizzati, ecc.), Che dato la domanda di OP sembra eccessivo. :( – askmish

3

è possibile scrivere una funzione simile a questa: (pseudo codice)

if(this is linux box) 
use truncate() 
else if (this is windows box) 
use _chsize_s() 

Questa è la soluzione più semplice per le vostre esigenze.

fare riferimento: l'uomo troncare e _chsize_s a msdn.microsoft.com

e includono file header necessari anche.

+0

Sapevo che avrebbe funzionato, ma lo faccio solo se ho davvero bisogno e non c'è altro modo. – MarcDefiant

Problemi correlati