logDatei einlesen und auf struct casten



  • Hallo,

    ich bin realtiv neu in C++ unterwegs und erst recht in MFC.
    Das hauptproblem bewegt sich aber glaube ich auf C++ eben und hat nicht viel mit MFC zu tun. Aber....naja aber wer weiß zu schreiben wäre jetzt schon banane.

    Also folgendes Problem:
    Ich soll eine Datei einlesen, welche nur stumpf aus bytes besteht.
    Jeder "Datensatz" besteht aus einer Zeile. Nun soll ich Zeilenweise den ganzen Kram auslesen und jedesmal die Zeile auf ein struct casten.

    Aber irgendwie klappt das nicht so wie ich mir das vorstelle:

    sSourceName = FileDlg.GetPathName();
            //this->DoesFileExist(sSourceName);
            this->cEdtReportField.SetWindowTextW(L"Ressource opened");
    
            char buffer[253];
            ifstream fsFileToConvert(sSourceName.GetString(), ios::in | ios::binary);
            LS_STRUCT test;
            fsFileToConvert.read(buffer, 255);
            S_STRUCT* test = reinterpret_cast<LSTRUCT*>(buffer);
    

    Der Sinn der sache ist, aus einem nicht verständlichen Log-File etwas Menschenlesbares zu machen.
    Mir wurde gesagt man kann die aus bytes bestehende zeile einfach auf ein struct casten, aber alle infos ausm Internet führten für mich in noch mehr Fehler 🙂

    Ich hoffe mein Problem ist nicht zu trivial 😕 🤡

    Danke schonmal für jeden Brotkrumen



  • Das fehlende L in meinem Post ist nicht das Problem 🙂

    Kam beim Umkopieren 🙂



  • thisArrowNothingHappend schrieb:

    Aber irgendwie klappt das nicht so wie ich mir das vorstelle:

    sSourceName = FileDlg.GetPathName();
            //this->DoesFileExist(sSourceName);
            this->cEdtReportField.SetWindowTextW(L"Ressource opened");
    
            char buffer[253];
            ifstream fsFileToConvert(sSourceName.GetString(), ios::in | ios::binary);
            LS_STRUCT test;
            fsFileToConvert.read(buffer, 255);
            S_STRUCT* test = reinterpret_cast<LSTRUCT*>(buffer);
    

    Der Sinn der sache ist, aus einem nicht verständlichen Log-File etwas Menschenlesbares zu machen.
    Mir wurde gesagt man kann die aus bytes bestehende zeile einfach auf ein struct casten, aber alle infos ausm Internet führten für mich in noch mehr Fehler 🙂

    Ich hoffe mein Problem ist nicht zu trivial 😕 🤡

    Danke schonmal für jeden Brotkrumen

    Wär es wohl zu viel verlangt zu beschreiben was genau nicht geht ?
    Auch könnte die Info welches Betriebssystem oder welcher Compiler verwendet werden manchmal nützlich sein....

    Ohne mich näher damit zu beschäftigen sehe ich bereits einige Dinge, die nicht gesund sind.

    1. Die Groesse von buffer ist mal 255 und mal 253 (also zu klein !?)
    2. Die Variable test kommt mehrfach vor.
    3. Wieso werden 255 byte gelesen wenn man eine struct erwartet von der die
    exakte Länge bekannt it ?

    Zum Beispiel müsste es eher heissen:

    std::ifstream is ("test.txt", std::ifstream::binary);
      if (is) {
        LS_STRUCT *buffer = new LS_STRUCT;
        is.read (buffer, sizeof(LS_STRUCT));
        if (is)
          std::cout << "all characters read successfully.";
        else
          std::cout << "error: only " << is.gcount() << " could be read";
    
        ... 
        is.close();
        delete buffer;
        }
    

    nachzulesen hier:
    http://www.cplusplus.com/reference/istream/istream/read/

    Möglicherweise wäre istream::getline besser, wenn die Zeile ein Zeilenende haben sollte.



  • Nein zuviel verlangt ist es natürlich nicht.

    Windows 7
    Visual Studio 2010

    Was geht nicht ist eine gute Frage. Ich hab viel herum probiert und immer nur Lösungen gefunden die irgendwie einen String direkt lesen.
    Will ich ja gar nicht.

    Ich will erst Zeilenweise aus einer Datei lesen und beim lesen einfach nur die reihnen bytes holen. Muss ich vorher sagen, wie groß eine Zeile ist. Kann der das nicht selber machen? Nun gut, wenn das sein muss dann kein Thema.

    Als nächstes will ich das ganze stumpf auf einen struct casten.
    Und das klappt nicht, ich konnte schon im char buffer etwas sehen mit diesen Haltenpunkten in VS aber weiter komm ich einfach nicht.

    Gibt es vieleicht irgendein gutes und empfehlenswertes Tutorial, welches sich mit dem ein und auslesen von dateien beschäftigt.



  • Ich versteh nicht was du Zeilenweise lesen willst wenn du das dann zum Schluss doch wieder in einen Struct legst dessen Größe dir doch bekannt ist?

    Oder hängen nach dem eigentlichen Struct-teil noch Daten an, dann müsste aber schon die Länge im Struct gegeben sein oder hast du ein bestimmtes Zeichen was dir das Zeilenende markiert und sonst nich vor kommt dann kannst du das doch mit istream::getline und dem Delimeter "zeilenweise einlesen udn dann immer noch auf den Struct casten.

    Wie das mit dem einlesen geht hat eigentlich merano schon gezeigt.

    Vielleicht solltest du hier auch mal dein Struct zeigen, damit man sich ein bild machen kann was du da vor hast also wie dieses aufgebaut ist.

    Wobei ich eben gerade gesehen habe das du LS_STRUCT test; anlegst aber nicht verwendest, dann S_STRUCT* test einen zeiger erstellst und einen cast der LSTRUCT auf die S_STRUCT machst, sieht sehr verwirrend aus und scheinbar auch irgendwie nicht richtig.

    Denn logischerweise würde das dann so aussehen

    BYTE buffer[255];
        //hier jetzt einlesen
        S_STRUCT* test = reinterpret_cast<S_STRUCT*>(buffer);
    


  • Ich hab's am Freitag mit gut ausdrücken nicht so gehabt. Sorry.

    Also bisher bin ich soweit:

    sSourceName = FileDlg.GetPathName();
            ifstream myFile;
            myFile.open (sSourceName, ios::in | ios::binary);
            char buffer[512*1024];
            if(myFile.is_open())
            {
                while (myFile.read(buffer,sizeof(buffer)))
                {
                    unsigned char temp[64];
                    memcpy(temp, buffer,64);
    
                    L_MEAS_STRUCT* temp_struct = reinterpret_cast<L_MEAS_STRUCT*>(temp);                
                }
            }
    

    Das läuft auch jetzt ganz gut.
    Allerdings habe ich nun feststelle müssen, das beim Cast auf das Struct, irgendwie die Bytes vertauscht werden.
    Nach suche im Internet bin ich auf die Begriffe little Endian und big Endian gestoßen. Scheint vom Eierköpfkrieg herzurühren 😉
    Daraufhin hab ich diese Funktionen gefunden:

    ntohl() //Network to Host byte order (Long)
    htonl() //Host to Network byte order (Long)
    
    ntohs() //Network to Host byte order (Short)
    htons() //Host to Network byte order (Short)
    

    Da diese Funktionen nichts mit einem struct anfangen können, habe ich versucht das Struct durch eine For-Schleife zu jagen. Allerdings ohne erfolg. Ich komm nicht an die einzelnen Elemente des structs.


Log in to reply