Mit fseek() an eine bestimmte Stelle im typedef struct {} springen
-
Hallo,
ich habe eine Frage zu fseek:
Die Datei file001 enthält eine Datenstruktur. Jeder struct-Datensatz fängt mit einer ID an. (die Datei hat auch noch einen header, der wird immer zuerst gelesen)
1. Frage: Wie kann ich nun am schnellsten auf den z.B 2000sten Datensatz nach dem header zugreifen? Ich möchte auf eine bestimmte ID direkt zugreifen können(ohne 2000mal fread zu durchlaufen).
2. Frage: Wie kann ich auf den letzten Datensatz zugreifen?Mein code liest bereits korrekt den header und den ersten Datensatz aus.
Danke
martin
//********************************************* typedef struct TabMeasureHeader; typedef struct TabMeasure { unsigned int ID; double StartTime; double EndTime; double Result; unsigned char Output; unsigned char SysCount; __int64 StartPos_TabSystem[6]; } t_TabMeasure; //... file001=fopen(DATEI001,"rb"); fread (&body, sizeof(t_TabMeasure), 1, file001); // gibt den 1. Datensatz nach dem header aus Id=body.ID; Startzeit=body.StartTime; Endzeit=body.EndTime; deltaE=body.Result; //dE Wert Ergebnis=body.Output; // 1=io 2=nio 3=noc Zaehler=body.SysCount; DatenPosition=body.StartPos_TabSystem;
-
Hallo !
Im Prinzip hast du die Lösung ja schon in deiner Überschrift formuliert:
Du kannst mit fseek an die bestimmte Stelle springen.Dafür musst du sie berechnen.
long pos = sizeof( struct TabMeasureHeader ) + (n-1) * sizeof( struct TabMeasure );
Um an die Position der ersten Struktur zu springen ist n = 1 zu setzen, usw.
Datei mit fopen öffnen und dann mit fseek den Dateizeiger setzen:
fseek( file001, pos, SEEK_SET);
ggf. den Rückgabewert von fseek abfragen, ob das Setzen erfolgreich war.
(fseek liefert bei Erfolg 0 zurück)
-
Kleine Ergänzung: Den Anfang des letzten Datensatzes erreichst du mit:
fseek(-sizeof(TabMeasure),SEEK_END);
-
Danke funktioniert super!