2012-10-19 9 views
5

Mein Code zur Zeit etwa wie folgt aussieht (diese Schritte in mehrere Funktionen aufgeteilt):klar/Datei in C gestutzt, wenn bereits geöffnet in „r +“ Modus

/* 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); 
} 

Ich weiß, dass ich mit in "w" die Datei öffnen konnte Modus, aber ich möchte das in diesem Fall nicht tun. Ich weiß, es gibt eine Funktion ftruncate in unistd.h/sys/types.h, aber ich möchte diese Funktionen nicht verwenden, mein Code sollte sehr portabel sein (auch auf Windows).

Gibt es eine Möglichkeit, eine Datei zu löschen, ohne sie zu schließen/wieder zu öffnen?

Antwort

4

Mit Standard C ist die einzige Möglichkeit, die Datei im "w +" - Modus jedes Mal neu zu öffnen, wenn Sie abschneiden müssen. Sie können dazu freopen() verwenden. "w +" wird weiterhin das Lesen erlauben, so dass es nicht nötig ist, im "r +" Modus zu schließen und erneut zu öffnen. Die Semantik von "w +" lautet:

Öffnen zum Lesen und Schreiben. Die Datei wird erstellt, wenn sie nicht existiert, andernfalls wird sie abgeschnitten. Der Stream befindet sich am Anfang der Datei.

(vom fopen Taken (3) man-Seite.)

Sie einen NULL-Zeiger als Dateiname-Parameter übergeben kann, wenn freopen() mit:

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

Wenn Sie nicht brauchen, lese überhaupt nicht mehr aus der Datei, wenn der "w" -Modus auch gut funktioniert.

+1

OP möchte eine plattformunabhängige Lösung und möchte die Datei nicht erneut öffnen. Und immer noch r +. :) – askmish

+0

@askmish Was ist nicht möglich :-P –

+0

@Nkos: Es ist möglich, aber die optimale Lösung wäre wirklich komplex (einschließlich Kernel-Aufrufe, gepufferte Mechanismen, etc.), die OP-Frage scheint übertrieben. :( – askmish

3

Sie können eine Funktion so etwas schreiben: (Pseudocode)

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

Dies ist die einfachste Lösung für Ihre Anforderung.

Siehe: Mann truncate und _chsize_s bei msdn.microsoft.com

und sind notwendig, auch die Header-Dateien.

+0

Ich wusste, dass das funktionieren würde, aber ich mache das nur, wenn ich wirklich muss und es gibt keinen anderen Weg. – MarcDefiant