Verständnisproblem fseek und fgetpos

E

EXS#42

Grünschnabel
Moin,

ich würde gerne wissen wie man ANSI C gerecht in einer Datei navigiert. In meinem Buch "Linux/Unix Systemprogrammierung" von Helmut Herold hat es den Anschein als gäbe es alte Funktionen (fseek, ftell) die man nicht verwenden sollte und neue Funktionen (fgetpos, fsetpos) die man stattdessen verwenden sollte.

Ich versteh allerdings nicht ganz wie man jetzt mit
Code:
fgetpos
eine bestimmte Position in einer Datei anspricht? So wie mit
Code:
fseek
bei dem man einen Offset und eine Startposition angeben kann, scheint es ja nicht zu gehen. Wenn ich das richtig verstanden habe müsste ich mit
Code:
fgetpos
byte-weise die Datei lesen, bis ich da bin wo ich eigentlich hinwollte. Ist aber eher unperformant.

Was ich eigentlich machen will ist folgendes. Ich möchte 512 Bytes in eine Datei schreiben und zwar an eine bestimmte Stelle der Datei.

Gefunden hab ich folgenden Link http://bytes.com/forum/thread200980.html, da hat jemand ein ähnliches Problem. Allerdings scheinen die sich auch nicht einig zu sein, wie man das jetzt am besten in den Griff bekommt.

mfg
EXS
 
Die manpage von fsetpos sagt:

The fsetpos() function shall set the file position and state indicators for the stream pointed to by stream according to the value of the object pointed to by pos, which the application shall ensure is a value obtained from an earlier call to fgetpos() on the same stream. If a read or write error occurs, the error indicator for the stream shall be set and fsetpos() fails.
Insbesondere wichtig ist:
which the application shall ensure is a value obtained from an earlier call to fgetpos()

fgetpos() und fsetpos() werden als Pärchen verwendet, um eine bestimmte Stelle einer Datei zu speichern und danach wieder genau an die Stelle zurückkehren zu können. Also zuerst fgetpos(), dann irgendwelche read/write/seek-Operationen, dann fsetpos() und man ist wieder an der alten Stelle zurück.
Für eine wahlfreie Positionierung bist Du also auch weiterhin auf fseek() angewiesen. Im übrigen weist
Code:
fpost_t pos = 22
dem struct fpos_t pos, also mithin der Adresse der Variablen, den Wert 22 zu. Macht man das im gdb kommt auch gleich zur Warnung "invalid cast". Das fpos_t sieht auf meiner Linux-Box auch so aus:
Code:
(gdb) p pos
$6 = {
  __pos = 0,
  __state = {
    __count = 0,
    __value = {
      __wch = 3221220136,
      __wchb = "(ëÿ¿"
    }
  }
}

Es würde mich interessieren, wie es bei Dir den Anschein erwecken konnte, dass die Funktionen fseek und ftell nicht verwendet werden sollten.
 

Ähnliche Themen

Wine Soundprobleme mit SoundMAX AD1986A unter Linux (Asus M2NPV-VM)

Server-Monitoring mit RRDTool

USB-Sound kackt nach einer Weile immer ab

Zurück
Oben