TFileStream und unkorrekte Zahlen



  • holladihossa!

    ich krieg hier gleich noch nen kolla...ich versuche seit mehreren stunden einen wert aus einer datei korrekt auszulesen...der wert ist 2 (hex: 00 02), ich bekomme aber 1 raus...ich bekomme nur bei "hex = 00 02" den falschen wert raus!!! warum? alle anderen werte stimmen, also wenn ich als hex: 00 0A in der datei stehen habe, kommt in meinem programm der wert 10 raus und so weiter und so fort... der falsche wert entsteht nur bei hex: 00 02

    der wert kommt aus einem header einer datei. der header ist 64 byte groß, für mich sind nur die ersten 28 bytes wichtig... ich lese die daten so aus:

    TFileStream *fd = new TFileStream(l, fmOpenRead);
      TDIHdr dh;  //größe 28 byte
      TDIDat dd[16384];
    
      g = fd->Read(&dh, sizeof(TDIHdr));
      if (g != sizeof(TDIHdr)) return;
      fd->Seek(0, soFromBeginning);
    
      //aufruf der datei setvertex um die daten auszulesen in eine struktur zu speichern
    
      SetVertex2(dh.kenn, dh.ver, dh.offset , dh.name, dh.dbuild, dh.tbuild, dh.loc, dh.soft, dh.pos);
    

    der header hat folgende form:

    typedef struct DIHDR {
    	 short kenn;
             short int ver, offset ;
             int name, dbuild, tbuild, loc;
    	 short soft;
             int pos;
           } TDIHdr;
    

    alle anderen werte werden in SetVertex2() korrekt ausgelesen! es ist nur der wert von dh.ver...

    kann sich irgendwer erklären, warum das so ist? ich verzweifel hier noch...

    danke für die tipps 🙂



  • Hallo,
    Vielleicht ist die Ausrichtung der Wortgrenzen nicht richtig. Schreibe doch mal vor Deiner typedef folgendes:

    #pragma pack(1)
    typedef struct DIHDR { 
         short kenn; 
             short int ver, offset ; 
             int name, dbuild, tbuild, loc; 
         short soft; 
             int pos; 
           } TDIHdr;
    #pragma pack()
    

    Gruß burkhard



  • ne, hat leider nicht geholfen 😞

    konkret geht es um diesen wert (hab ich vorhin vergessen): "dh.ver"! in der datei hat er den wert 2 in meinem programm liest er 1 aus! echt komisch das ganze! alle anderen werte aus der datei werden richtig ausgelesen, nur "dh.ver" nicht! warum auch immer...naja, vielleicht ist es ja ein fehler von borland! ich erkenne nämlich wirklich nicht, was ich falsch gemacht haben könnte...

    hier nur mal ein beispiel, wie die hex-werte (mit ultraedit ausgelesen) für die ersten drei variablen in der datei aussehen könnten:

    33 49 02 00 40 00 (die hex werte der datei=

    die ersten beiden bytes (0-1) gelten "dh.kenn" und werden korrekt mit '18739' ausgelesen! der zweite wert (die bytes 2-3) müsste jetzt 2 ergeben, es kommt aber 1 raus (für "dh.vers")! der dritte wert (bytes 4-5) ist wieder korrekt mit '64' ausgelesen! die weiteren werte werden auch korrekt ausgelesen!

    ich hab echt keine ahnung was falsch ist 😞



  • Hallo,
    ich habe grad mal einen Test gemacht, also bei mir klappt es mit dem einlesen, die Struktur hat die richtigen Werte (auchdh.ver 😉 ).

    alle anderen werte werden in SetVertex2() korrekt ausgelesen! es ist nur der wert von dh.ver...

    Debugge dein Programm und schaue dir an, ob das wirklich beim Einlesen passiert, oder ob nicht doch deine SetVertex2()-Funktion der Übeltäter ist.



  • Burkhi schrieb:

    Hallo,
    Debugge dein Programm und schaue dir an, ob das wirklich beim Einlesen passiert, oder ob nicht doch deine SetVertex2()-Funktion der Übeltäter ist.

    jo, alles schon getestet 🙂 kein unterschied! die funktion SetVertex2() schreibt die daten auch nur aus der einen struktur in die andere (klingt sinnlos, ist es aber nicht 🙂 )...ändert an den werten also nichts...

    vielleicht hab ich einstellungen in meinem projekt falsch?!?



  • hi, ich hole diesen thread mal nochmal heraus 🙂

    also, ich bin immernoch kein stück weiter gekommen 😞 egal was ich auch mache, es wird immer der wert '1' ausgelesen...egal, ob ich komplett aus der struktur auslese oder ob ich nur dh.ver auslese...hat keiner von euch eine idee? im hex-editor zeigt er folgende werte für die ersten bytes an:

    33 49 02 00

    in meiner struktur kommen dann für die ersten beiden bytes kommt der wert 18739 raus und für die bytes 3 und 4 kommt der wert 1 raus 😞

    wäre super, wenn einer noch eine idee hat! ansonsten könnte ich doch auch vielleicht die Hex-Werte direkt auslesen, oder? Wie ist denn das möglich?



  • Onkel Hotte schrieb:

    //aufruf der datei setvertex um die daten auszulesen in eine struktur zu speichern
      SetVertex2(dh.kenn, dh.ver, dh.offset , dh.name, dh.dbuild, dh.tbuild, dh.loc, dh.soft, dh.pos);
    

    Was ist denn SetVertex2() für eine Funktion? Habe dazu in der Hilfe nichts gefunden.

    Gruß,

    Alexander



  • [quote="Alexander Kempf"]

    Onkel Hotte schrieb:

    [cpp]
    Was ist denn SetVertex2() für eine Funktion? Habe dazu in der Hilfe nichts gefunden.

    das ist eine von mir erstellte methode! diese speichert einfach nur die werte aus der struktur in variablen! ändert an den werten selber nichts...



  • Onkel Hotte schrieb:

    das ist eine von mir erstellte methode!

    Na, da wäre es doch nicht völlig verkehrt, diese Methode mal ein bißchen genauer
    zu zeigen (Quelltext).

    Gruß,

    Alexander



  • Alexander Kempf schrieb:

    Na, da wäre es doch nicht völlig verkehrt, diese Methode mal ein bißchen genauer
    zu zeigen (Quelltext).

    jo, wenn du meinst 🙂 jedoch ist der wert schon VOR dem aufruf der methode falsch...

    hier die methode:

    //---------------------------------------------------------------------------
    /*SetVertex2 liest sämtliche Werte aus der Headerdatei aus*/
    //---------------------------------------------------------------------------
    void TFrMain::SetVertex2(short ke, short ve, short da, int na, int db, int tb, int lo, short so, int po)
    {
      I3.k = ke;
      I3.v = ve;
      I3.N = na;
      I3.d = da;
      I3.db = db;
      I3.tb = tb;
      I3.l = lo;
      I3.s = so;
      I3.p = po;
    }
    


  • Noch ein Zusatz:

    ist es möglich die hex-werte aus einer datei direkt auszulesen (am besten mit TFileStream)? ich möchte also die hex-werte erhalten...wenn ja, wie geht das?

    dann kann ich sie im notfall halt mit StrToInt 'per Hand' konvertieren...



  • Onkel Hotte,
    das hier ...

    TDIHdr dr;
    dr.kenn = 1;
    dr.ver = 2;
    dr.offset = 3;
    dr.name = 4;
    dr.dbuild = 5;
    dr.tbuild = 6;
    dr.loc = 7;
    dr.soft = 8;
    dr.pos = 9;
    
    TFileStream *fd = new TFileStream("gaga.txt", fmCreate | fmOpenReadWrite);
    fd->Write(&dr, sizeof(TDIHdr));
    
    TDIHdr dr2;
    fd->Position = 0;
    fd->Read(&dr2, sizeof(TDIHdr));
    delete fd;
    

    funktioniert problemlos.



  • tja, ich weiß, dass es bei den meisten klappt...

    ich habe jetzt mal folgendes ausprobiert:

    TFileStream *fd = new TFileStream(l, fmOpenRead);
      TDIHdr dh;
    
      g = fd->Read(&dh, sizeof(TDIHdr));
      TFileStream *fd2 = new TFileStream("gaga.txt", fmCreate | fmOpenReadWrite);
      fd2->Write(&dh, sizeof(TDIHdr));
      if (g != sizeof(TDIHdr)) return;
      fd2->Position = 0;
      fd2->Seek(0, soFromBeginning);
      SetVertex2(dh.kenn3di, dh.vers, dh.dataoffset , dh.name, dh.datebuild, dh.timebuild, dh.location, dh.soft, dh.points);
    
      fd2->Seek(64, soFromBeginning);
    

    er speichert also den inhalt aus der alten datei in eine neue! mein hex-editor gibt jetzt folgende werte für die ersten vier bytes aus:

    33 49 01 00

    das kann doch nicht wahr sein 😮 ...er hat den wert wieder auf 1 geändert!!!



  • au mann...ich traue es mir gar nicht zu sagen, was falsch war 🙄

    naja, mein quellcode ist völlig ok und gibt absolut die richtigen werte aus! ich hatte einen logischen fehler in meinem programm! au mann, meine software hat immer aus der falschen datei die daten ausgelesen...harr...solche dusseligen fehler kosten ganze 3(!!!) tage! so ein mist 😮



  • Onkel Hotte schrieb:

    mann, meine software hat immer aus der falschen datei die daten ausgelesen...harr...solche dusseligen fehler kosten ganze 3(!!!) tage! so ein mist 😮

    Tja, nur, wenn man bei der Fehlersuche etwas... ich nenn es mal unstrukturiert vorgeht und z.B. nicht alle äusseren Einflüsse prüft...

    -junix


Anmelden zum Antworten