byteweise schreiben.



  • Du hast einen char dekalriert und packst in den das erste Byte der Adresse deiner Tabelle - anschließend schreibst du diesen char und die nächsten x Bytes in deine Datei (was dort steht, gehört dir nicht einmal), also brauchst du dich nicht wundern, wenn du nur Müll bekommst. Richtig wäre es, wenn du einen char* verwendest:

    void WriteToFile(string name,const TCORRECTIONTABLE& data)
    {
      char* byteptr=reinterpret_cast<char*>(&data);
      ofstream file(name.c_str(),ios::out|ios::binary);
      file.write(byteptr,sizeof(data));
    }
    

    PS: Ein zweiter Fehler - du hast deine Tabellen lokal definiert, also werden sie am Ende jeder Funktion gelöscht.

    PPS: In C++ solltest du besser fstreams verwenden anstelle von C FILE-Pointern 😉



  • aber jetzt nochmal vorab. zu meinem EDIT: ist das denn nicht komisch das wenn ich tcorrectiontable aufrufe da nichts mehr drinsteht ? also ich bin mit dem debugger durchgegangen in der funktion in der er das in das struct schreibt. kein problem kann die daten einsehen die er reingeschrieben hat. wenn ich aber in der funktion nen brekpoint setze in der die datei geschrieben is und nachgucke was in tcorrectiontable drinsteht. dann steht nur der erste wert der mit unsigned int deklariert ist im struct. die anderen char elemente sind leer. bzw es steht "52 I " da drin.

    EDIT: k werde das mal verseuchen. die anders zu definieren,

    EDIT 2: 😞 wie mache ich das denn ? und wieso steht 1 wert immer noch drin nur die char werte werden gelöscht ?

    habe es so gemacht

    WriteDataToStruct (FDD_scenter[z],CorrectionTable);
    
                   WriteCorrDataToFile(FileName_end,CorrectionTable);
               }
    
    double WriteDataToStruct(unsigned int FDD_scenter,TCORRECTIONTABLE CorrectionTable )
    {
    
      ;
    

    wenn ich da nen const hinmache sagt der mir nur errors weil der L_Wert konstant ist.



  • Vodn7V schrieb:

    ist das denn nicht komisch das wenn ich tcorrectiontable aufrufe da nichts mehr drinsteht ?

    Nicht wirklich - du hast zwei Tables angelegt (in jeder Funktion eine eigene) und die werden jeweils am Ende der Funktion wieder aufgeräumt. Du solltest stattdessen in der Hauptfunktion eine Tabelle anlegen und diese an die Hilfsfuntkionen übergeben:

    void WriteToFile(const string& name,const TCORRECTIONTABLE& data)
    {
      //siehe oben
    }
    
    void FillStruct(TCORRECTIONTABLE& data)
    {
      for(int j = 0; j < 1023; j++)
      {
        for(int x = 0; x < 15; x++)
        {
          data.FacetNum[x].CorrPoint[j].DDS_REG_VAL = FDD_scenter;
          data.FacetNum[x].CorrPoint[j].Intens = 0x7F;
          data.FacetNum[x].CorrPoint[j].CrossScan = 0x7F;
          data.FacetNum[x].CorrPoint[j].Facet_Offset = 0x00;
          data.FacetNum[x].CorrPoint[j].Not_Used = 0x00;
        }
      }
    }
    
    int main()
    {
      TCORRECTIONTABLE CorrectionTable;
      FillStruct(CorrectionTable);
      ...
      WriteToFile("table.dat",CorrectionTable);
    }
    

    (Edit: Und damit die Daten ans Hauptprogramm zurückgehen können, mußt du die Tabelle als Referenz übergeben (das ist das unscheinbare & vor dem Namen ;)))



  • k das versteh ich danke. habe soweit alles umgeschrieben. jetzt jedoch die meldung :

    error C2440: 'reinterpret_cast' : 'const struct TCORRECTIONTABLE *' kann nicht in 'char *' konvertiert werden
    

    was hab ich jetzt schon wieder falsch gemacht ?

    EDIT: aber sehr geil mit der übergabe der daten das klappt jetzt schonmal 🙂

    EDIT2: habe das const einfach weggemacht. jetz tgeht es 🙂

    *knuuuuuuuuuuuuuuuuuuutsch*

    DANKE DIR !!!!!



  • so das gute Forum !

    ihr habt echt nen dickes Lob verdient. auch wenn es nicht immer einfach mit mir oder den anderen die noch nichts so vie ahnung davon haben ist, wird einem trotzdem immer bestens geholfen.

    PERFEKT !!

    EDIT: ihr könnt ja bald schon lehrgeld nehmen 🙂 habe schon sehr viel bei euch gelernt !



  • hätte da doch noch mal nme frage 🙂

    konnte nirgends was finden. weder bei google noch hier . also ich schreiben ja so in die datei :

    char* byteptr = reinterpret_cast<char*>(& data);
    
      ofstream file(FileName_end,ios::out|ios::binary);
    
      file.write(byteptr,sizeof(data));
    

    meine frage:

    ich habe jetzt einen pfad den ich mit dem filedialog auslese. wie füge ich den in die fwrite funktion ein, so dass er auch in den pfad schreibt ??

    danke



  • Vodn7V schrieb:

    ich habe jetzt einen pfad den ich mit dem filedialog auslese. wie füge ich den in die fwrite funktion ein, so dass er auch in den pfad schreibt ??

    Gar nicht - fwrite() bzw. fstream::write() erwartet, daß du vorher die richtige Datei geöffnet hast. (und das machst du, indem du den Dateinamen an den ofstream-Konstruktor übergibst)



  • ich öffne doch vorher gar keine datei oder ? ich erstelle doch jedes mal eine neue mit fwrite. dem knstrukot übergeb ich meinen dateinamen ja, aber ist es nicht möglich den pfad mit zu übergeben ?



  • Vodn7V schrieb:

    ich öffne doch vorher gar keine datei oder ?

    Doch - das erledigt der Konstruktor "ofstream file(FileName_end,ios::out|ios::binary);" freundlicherweise für dich 😉

    ich erstelle doch jedes mal eine neue mit fwrite.

    Nein fwrite() erzeugt keine Datei - es füllt nur eine bereits geöffnete Datei (fopen()) mit Daten.

    (PS: Wie gesagt, in C++ solltest du statt der f...()-Funktionen lieber fstreams verwenden)

    dem knstrukot übergeb ich meinen dateinamen ja, aber ist es nicht möglich den pfad mit zu übergeben ?

    Dem Konstruktor kannst du alles übergeben, was nach Dateiname aussieht - auch einen kompletten Pfad zur Datei.



  • pefekt. es geht. besten dank !!


Anmelden zum Antworten