2013-03-29 4 views
5

So bin ich nicht ganz sicher, wie man fread benutzt. Ich habe eine Binärdatei in Little-Endian, die ich in Big-Endian konvertieren muss, und ich weiß nicht, wie ich die Datei lesen soll. Hier ist, was ich bisher:Woher weiß fredet, wenn die Datei in C beendet ist?

FILE *in_file=fopen(filename, "rb"); 
char buffer[4]; 
while(in_file!=EOF){ 
    fread(buffer, 4, 1, in_file); 
    //convert to big-endian. 
    //write to output file. 
} 

ich nichts anderes noch geschrieben haben, aber ich bin einfach nicht sicher, wie fread zu ‚Fortschritt‘ zu bekommen, so zu sprechen. Jede Hilfe wäre willkommen.

+0

Vervollständigen Sie das Programm und führen Sie es aus! 'fread' liest von wo es das letzte Mal in der Schleife aufgehört hat. Sie sollten den Rückgabewert von 'fread' überprüfen. "Infile" ist wahrscheinlich nicht gleich "EOF". –

+4

Der erste Schritt zum Fortschritt ist das Lesen der Dokumentation **. –

+1

Zum einen bedeutet "rb" ** R ** ead ** B ** inary, also sollte Ihr Array vom Typ int, nicht char sein. – MarcusJ

Antwort

13

Das ist nicht, wie Sie richtig aus einer Datei in C lesen

fread gibt eine size_t die Anzahl der Elemente erfolgreich gelesen darstellt.

FILE* file = fopen(filename, "rb"); 
char buffer[4]; 

if (file) { 
    /* File was opened successfully. */ 

    /* Attempt to read */ 
    while (fread(buffer, 1, 4, file) == 4) { 
     /* byte swap here */ 
    } 

    fclose(file); 
} 

Wie Sie sehen können, würde der obige Code so bald aufhören zu lesen als fread alles andere Extrakte als 4 Elemente.

+2

Ich empfehle 'while (fread (buffer, 1, 4, file) == 4) {...}' um sicherzustellen, dass 4 Bytes gelesen werden und das undefinierte Verhalten der Verwendung nicht initialisierter Werte zu vermeiden. – Sebivor

+0

Danke, dass du das gemacht hast. Ich habe gerade gemerkt, dass ich 1 für die Größe und 4 für die Zählung verwenden sollte. Auch, ehrfürchtiger Name Bro! –

+0

In der Tat. Das hatte ich jedoch nicht bemerkt. Mein Kommentar bezog sich auf den expliziten Vergleich des Rückgabewerts mit 4 anstelle von 0, denn wenn fread 3, 2 oder 1 zurückgeben würde, gäbe es nicht initialisierte Bytes im Puffer, was zu undefiniertem Verhalten führen würde, wenn diese Werte verwendet würden. – Sebivor