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! 🙂


Anmelden zum Antworten