2012-06-13 30 views
8

Wie kann ich feststellen, ob eine Datei leer ist? Die Datei wird von einem C-Programm geöffnet, das auf der Windows-Plattform ausgeführt wird. Ich möchte eine Datei im Append-Modus öffnen und, wenn sie leer ist, zuerst eine Kopfzeile ausdrucken.Wie kann ich feststellen, ob eine Datei leer ist?

// Open CSV & write header 
report_csv = fopen("SNR.csv", "a+"); 
if (!report_csv) { 
    fprintf(stderr, "Unable to open CSV output file..."); 
    return -1; 
} 
if (!ftell(report_csv)) { 
    fprintf(report_csv, "Column A;Column B;Column C\n"); 
} 
// ... print data to file 
fclose(report_csv); 

Ich erwartete ftell die aktuelle Dateigröße zurück, wenn die Datei nicht leer war, was geschieht, weil der Code oben geschlungen ist.

Allerdings gibt ftell immer 0 zurück und die Kopfzeile wird mehrmals gedruckt.

Ich weiß, dass ich es mit r und fseek/ftell/fclose und dann fopen es wieder mit a+ verwenden fopen könnte, aber ich denke, dass es möglich ist, dies ohne Öffnung zu tun und Schließen der Datei mehrfach.

+0

Datei-E/A-Vorgänge unterscheiden sich zwischen den Betriebssystemen, also ... mit welchem ​​Betriebssystem arbeiten Sie? –

+1

'CSV-Ausgabedatei kann nicht geöffnet werden ...' ist das kanonische Beispiel für eine * bad * -Fehlermeldung. Fügen Sie den tatsächlichen Dateinamen und den Grund für den Fehler ein ('man perror' und' man strarror'). –

+0

@EitanT: das ist für Windows –

Antwort

6

Eigentlich, wenn fopen ing eine Datei im Append-Modus, wird der Dateizeiger zunächst am Anfang der Datei . Es bewegt sich bis zum Ende davon, sobald Sie etwas schreiben oder fseek verwenden.

Ich musste nur fseek(report_csv, 0, SEEK_END); vor meinem if (!ftell(report_csv)) hinzufügen.

Lassen Sie uns dies überprüfen.
-Code:

#include <stdio.h> 

int main(int argc, char **argv) { 
    FILE *test; 
    size_t size; 
    char buf[100]; 

    /* Truncate file */ 
    test = fopen("test", "w"); 
    if (!test) { 
     fprintf(stderr, "Cannot open file `test`!\n"); 
     return 1; 
    } 

    /* Write something */ 
    fprintf(test, "Something. "); 
    fclose(test); 

    /* Open in append */ 
    test = fopen("test", "a+"); 
    if (!test) { 
     fprintf(stderr, "Cannot open `test` in append mode!\n"); 
     return 1; 
    } 

    /* Try to get the file size */ 
    size = ftell(test); 
    printf("File pointer is: %d\n", size); 
    fseek(test, 0, SEEK_END); 
    size = ftell(test); 
    printf("After `fseek(test, 0, SEEK_END)`, the file pointer is: %d\n", size); 

    /* Append */ 
    fprintf(test, "And that. "); 
    fclose(test); 

    /* Same without fseek */ 
    test = fopen("test", "a+"); 
    if (!test) { 
     fprintf(stderr, "Cannot open `test` in append mode!\n"); 
     return 1; 
    } 
    fprintf(test, "Hello! "); 
    size = ftell(test); 
    printf("File size is now: %d\n", size); 
    fclose(test); 

    /* Try to read */ 
    test = fopen("test", "r"); 
    if (!test) { 
     fprintf(stderr, "Unable to open `test` for reading!\n"); 
     return 1; 
    } 
    printf("File contents:\n\t"); 
    while (test && !feof(test)) { 
     fgets(buf, sizeof(buf), test); 
     printf("%s", buf); 
    } 

    /* Cleanup & exit */ 
    fclose(test); 
    printf("\n\nExiting.\n"); 

    return 0; 
} 

Ausgang:

File pointer is: 0 
After `fseek(test, 0, SEEK_END)`, the file pointer is: 11 
File size is now: 28 
File contents: 
     Something. And that. Hello! 

Exiting. 
1

Sie können _stat() anrufen und erhalten den Wert st_size in struct _stat (Sie müssen die Datei nicht öffnen). Erklärte
folgte in sys/types.h von sys/stat.h
Ich weiß nicht, Windows-Programmierung, aber es kann Ihnen helfen: http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx

2

Wenn Sie eine Datei mit fopen mit dem a+-Modus zu öffnen, werden alle Schreibvorgänge werden am Ende der Datei durchgeführt werden. Sie können den internen Zeiger zum Lesen an eine beliebige Stelle in der Datei verschieben, aber durch Schreibvorgänge wird er wieder an das Ende der Datei verschoben. Die anfängliche Zeigerposition zum Lesen befindet sich am Anfang der Datei.

So müssen Sie einen fseek(pFile, 0, SEEK_END) auf Ihrem FILE Zeiger aufrufen.

+0

Ja, das stimmt! Das habe ich erst vor zehn Minuten herausgefunden. Danke vielmals. –

+0

Die Seite wurde nicht aktualisiert ... sorry :) –

Verwandte Themen