Woher weiß fread, wann die Datei in C zu Ende ist?

Lesezeit: 2 Minuten

Benutzeravatar von user202925
Benutzer202925

Daher bin ich mir nicht ganz sicher, wie ich Fread verwenden soll. 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. Folgendes habe ich bisher:

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 habe noch nichts anderes geschrieben, aber ich bin mir einfach nicht sicher, wie ich Angst dazu bringen kann, sozusagen „Fortschritte“ zu machen. Jede Hilfe wäre dankbar.

  • Vervollständigen Sie das Programm und führen Sie es aus! fread liest an der Stelle weiter, an der es beim letzten Durchlauf der Schleife aufgehört hat. Sie sollten den Rückgabewert von überprüfen fread. infile ist wahrscheinlich nicht gleichwertig EOF.

    – luser droog

    29. März 2013 um 5:23


  • Zum einen bedeutet „rb“. Read Binary, daher sollte Ihr Array vom Typ int und nicht vom Typ char sein.

    – MarcusJ

    4. Mai 2015 um 21:26

  • Eigentlich bin ich anderer Meinung. Das Array sollte aus Zeichen bestehen. Binäre Zeichen bestehen nur aus einem einzelnen Byte, während eine Ganzzahl aus 4 Bytes besteht. In diesem Fall wäre die Verwendung eines char-Arrays eine bessere Darstellung, da ein char ein Byte darstellt.

    – Ian Leaman

    27. Februar 2016 um 21:07 Uhr

Benutzeravatar von user123
Benutzer123

So liest man in C nicht richtig aus einer Datei.

fread gibt a zurück size_t stellt die Anzahl der erfolgreich gelesenen Elemente dar.

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

if (file) {
    /* File was opened successfully. */
    
    /* Attempt to read */
    while (fread(buffer, sizeof *buffer, 4, file) == 4) {
        /* byte swap here */
    }

    fclose(file);
}

Wie Sie sehen, würde der obige Code sofort aufhören zu lesen fread extrahiert alles andere als 4 Elemente.

  • Ich schlage vor while (fread(buffer, 1, 4, file) == 4) { ... } um sicherzustellen, dass 4 Bytes gelesen werden und das undefinierte Verhalten bei der Verwendung nicht initialisierter Werte vermieden wird.

    – autistisch

    29. März 2013 um 5:32


  • Vielen Dank, dass Sie das angesprochen haben. Mir ist gerade klar geworden, dass ich 1 für die Größe und 4 für die Anzahl verwenden sollte. Außerdem toller Name, Bruder!

    – Benutzer123

    29. März 2013 um 5:33


  • In der Tat. Das war mir allerdings nicht aufgefallen. Mein Kommentar bezog sich auf den expliziten Vergleich des Rückgabewerts mit 4 statt mit 0, denn wenn fread 3, 2 oder 1 zurückgeben würde, wären nicht initialisierte Bytes im Puffer vorhanden, was bei Verwendung dieser Werte zu undefiniertem Verhalten führen würde.

    – autistisch

    29. März 2013 um 5:36


  • aber was ist, wenn die Datei beispielsweise 4 Zeichen enthält?

    – space_mill

    7. Januar 2022 um 4:36

1452430cookie-checkWoher weiß fread, wann die Datei in C zu Ende ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy