Ich lese Daten aus einer Datei in den Speicher, die geöffnet wird mit:
FILE *f = fopen(path, "rb");
Bevor ich anfange, Bytes aus der Datei zu kopieren, suche ich mit:
/**
* Goes to the given position of the given file.
*
* - Returns 0 on success
* - Returns -1 on EOF
* - Returns -2 if an error occured, see errno for error code
* - Returns -3 if none of the above applies. This should never happen!
*/
static int8_t goto_pos(FILE *f, uint64_t pos)
{
int err = fseek(f, pos, SEEK_SET);
if (err != 0) {
if (feof(f) != 0) return -1;
if (ferror(f) != 0) return -2;
return -3;
}
return 0;
}
Das Problem ist, dass, obwohl ich eine Position weit darüber hinaus anstrebe EOF
gibt diese Funktion niemals -1 zurück.
Laut Referenz feof
sollte einen Wert ungleich Null zurückgeben, wenn EOF
angetroffen wird.
Warum ist das? Ist der feof
Funktion unbrauchbar?
Beachten Sie, dass ich derzeit den Rückgabewert von verwende fgetc
zu prüfen EOF
.
Wo in den Dokumenten von fseek haben Sie gesehen, dass es das EOF-Flag setzen würde?
– Matte
23. Juni 2013 um 18:22 Uhr
@Mat: Das OP sagt das nicht explizit …
– alk
23. Juni 2013 um 18:27 Uhr
@alk: Warum hast du das Bedürfnis, herablassend zu sein? Es hilft weder mir noch sonst jemandem.
– rzetterberg
23. Juni 2013 um 21:42 Uhr
Ich wollte das nicht persönlich nehmen. Bitte entschuldigen Sie den etwas zynischen Versuch, die Leute zum Lesen der Dokumentation zu drängen. Btw: Im allgemeinen Fall ist es eine gute Idee, die mit dem Tool gelieferte Dokumentation selbst zu drehen, in diesem Fall die Manpages, die mit der Entwicklungswerkzeugkette unter Linux geliefert werden.
– alk
24. Juni 2013 um 5:30 Uhr
Bei Unsicherheiten ist es immer ratsam, mehr als eine Informationsquelle zu konsultieren. Eine gute Referenz zum “wie es sein soll” ist der Standard: pubs.opengroup.org/onlinepubs/9699919799/idx/functions.html (POSIX), ein Überblick was ist in der GNU libc: gnu.org/software/libc/manual/html_node/… und schließlich können die Manpages hier aus der Quelle gelesen werden: manpages.debian.net/cgi-bin/man.cgi (ohne keine lästige Werbung!)
– alk
24. Juni 2013 um 6:50 Uhr