3 Stimmen

feof() in der C-Dateiverarbeitung

Ich lese eine Binärdatei Byte für Byte, ich muss feststellen, ob eof erreicht wurde oder nicht.

feof() funktioniert nicht, da "eof nur gesetzt wird, wenn eine Leseanforderung für ein nicht vorhandenes Byte gestellt wird". Also, ich kann meine benutzerdefinierte check_eof wie haben:

if ( fread(&byte,sizeof(byte),1,fp) != 1) {
    if(feof(fp))
    return true;
}
return false;

Aber das Problem ist, wenn eof nicht erreicht wird, wird mein Dateizeiger um ein Byte nach vorne verschoben. Eine Lösung wäre also die Verwendung von ftell() und dann fseek() um sie in die richtige Position zu bringen.

Eine andere Lösung könnte darin bestehen, das Byte im Voraus in einem Zwischenspeicher zu puffern.

Gibt es bessere Lösungen?

6voto

jamesdlin Punkte 63159

Wenn Sie ein Byte auf einmal lesen, ist der idiomatische Weg, dies zu tun, mit fgetc :

int c;
while ((c = fgetc(fp)) != EOF) {
   // Do something.
}

und dann sollten Sie sich nicht mit feof .

3voto

Kristopher Johnson Punkte 78933

In der Regel gehe ich folgendermaßen vor:

int get_next_char(FILE* fp, char *ch)
{
    return fread(ch, sizeof(char),1, fp) == 1;
}

// main loop
char ch;
while (get_next_char(fp, &ch))
    process_char(ch);

if (!feof(fp))
    handle_unexpected_input_error(fp);

2voto

R Samuel Klatchko Punkte 72641

Am besten strukturieren Sie Ihren Code so, dass Sie versuchen, einige Daten zu lesen, und wenn das Lesen aufgrund des Erreichens des Endes der Datei nicht erfolgreich ist, behandeln Sie es dort (d.h. siehe Die Antwort von Kristopher Johnson ).

Wenn Sie das absolut nicht mögen, können Sie ungetc um ein einzelnes Zeichen an den Stream zurückzugeben, das dann beim nächsten Leseaufruf zur Verfügung steht:

int c = fgetc(fp);
if (c == EOF)
{
    // handle eof / error
}
else
{
    ungetc(c, fp);

    // the next read call is guaranteed to return at least one byte

}

0voto

KevinDTimm Punkte 14006

Ich bin nicht klar, aber wenn Sie daran interessiert sind, zu wissen, bevor Sie das Byte lesen, wenn EOF erreicht wurde, setzen Sie Ihre feof() Test vor der fread() statt nach ihm.
Wenn ich richtig gelesen habe, wollen Sie nicht einmal das fread so machen:

return feof(fp) ? true : false;

0voto

abelenky Punkte 60187

Ich würde die Verwendung vorschlagen:

fseek(myFile, 0, SEEK_END);
fileLen = ftell(myFile);
fseek(myfile, 0, SEEK_SET);

Wenn Sie die Datei zum ersten Mal öffnen, um die Länge zu bestimmen. Richten Sie dann Ihre Leseschleife so ein, dass Sie niemals das Ende ablesen. Sie können verwenden ftell um herauszufinden, wo Sie sich befinden, und vergleichen Sie mit fileLen, um herauszufinden, wie weit Sie noch gehen müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X