Datei in Vector, Teile auslesen. wie?



  • Hallo miteinander

    Ich habe ein kleines Problem:
    Eine Datei wird eingelesen und in einen Vector gespeichert. Jetzt möchte ich Teile aus diesem Vector entnehmen und weiter verarbeiten.
    Dabei bin ich auf mehrere Probleme gestossen:

    1. Zeilenweise Auslesen und in den Vector speichern geht, nur ist die Information anscheinen auf eine Zeile begrenzt:
    FA 02 02 03 00 00 00 00      FA 02 02 03 00 00 00 00                ........ ........ 
    3C 03 4C 03 00 00 00 00      7F 03 96 03 00 00 00 00                <.L..... ........ 
    C1 03 E0 03 00 00 00 00      04 04 29 04 00 00 00 00                ........ ..)..... 
    46 04 73 04 00 00 00 00      88 04 BD 04 00 00 00 00                F.s..... ........
    

    den gesammten Inhalt der Primärdatei kann ich so in eine andere abspeichern:

    std::vector< std::string > allItems;
    //
    fout << allItems[0];
    
    1. Wenn ich die Datei über direkt in char Array speichere, ignoriert er mir die Hex-Werte und nimmt nur die Buchstaben.
    2. die Werte möchte ich für späteres weiterverarbeiten in verschiedene Array's (am liebsten int) extrahieren.
      Jeweils von den Hex-Werten:
      -Byte 1 und 2 in 16Bit "position1[]"
      -Byte 3 und 4 in 16Bit "position2[]"
      -Byte 5 in 8Bit "status1[]"
      -Byte 6 in 8Bit "status2[]"
      -Byte 7 in 8Bit "netz1[]"
      -Byte 8 in 8Bit "netz2[]"
      Anschliessend die nächsten 8 Byte und dann müssten, da alles auf einer Zeile ist die nächsten 16 Byte übersprungen werden. Das wäre nicht das Problem.

    Ich hoffe ihr versteht mein Anliegen

    Besten Dank für die Unterstützung
    MFG
    P51D



  • Ich versteh jetzt zwar iregendwie dein Problem nicht wirklich, aber wenn sich die Daten immer wieder wiederholen, dann leg doch eine struktur an in die du die Daten lädst und deren Zeiger du dann in einen Vektor oder was weis ich speichern kannst.

    struct Data
    {
        WORD position1,
        WORD position2,
        BYTE status1,
        BYTE status2,
        BYTE netz1,
        BYTE netz2
    };
    


  • Bei der Datei handelt es sich um eine .ild Datei, welche ich einlesen soll.

    Die ganze Datei kann ich ohne Probleme einlesen und wieder in eine andere neue Datei ausgeben. Die Hex-Werte und dieses Format vom obigen Beispiel ist nur in einem speziellen Editor ersichtlich, ansonsten wird nur Ramsch angezeigt.

    Bis jetzt habe ich die einzige Möglichkeit, die wirklich alle Informationen kopiert mit dem Vector gefunden, da irgendwie bei der Char Variante nur Buchstaben berücksichtigt werden (Array überdimensional gross, also müsste mehr angezeigt werden).

    Das mit dem Struct wäre dann die Lösung für die Organisation der zu verarbeitenden Daten. Aber ich weiss dennoch nicht, wie ich die Informationen wieder aus dem Vector bekomme. Substr und dergleichen gibts ja nicht. Ebensowenig hatte ich Erfolg mit der Konvertierung des Vectors in eine Char-Array, in der ich dann pro Byte eine Information hätte.
    Extrem praktisch wäre es, wenn man etwas in der Variante machen könnte:

    char infos[];
    std::vector< std::string > allItems;
    infos = allItems[0];
    

    Aber dennoch, besten Dank für die Antwort
    MFG
    P51D



  • Das kann doch auch nicht gehen, du hast binärdaten und versuchst die in einen string zu pressen, string kann aber nur texte behandeln und endet bei der ersten Binären NULL die auftritt deswegen geht das alles nicht. also du kannst das schon in einen char packen, doch darfst du keine Funktionen benutzen die strings bearbeiten oder kopieren. Die brechen dann halt eher ab, behandel das doch wie daten die im ram stehen und fertig, ob du da jetzt einen vector nimmst oder das mit einem array machst oder die daten gleich in die structur schreibst is doch völlig egal.



  • ah, ok. Jetzt dämmerts ein wenig.

    Besten Dank für die Wegweisung

    MFG
    P51D



  • Da du ja nix weiter zu deinen daten sagst und wie du die laden willst ist es halt schwer passende Tips zu geben, aber wenn die daten eine immerwiederkehrende Structur ist, dann erstell dir doch was entsprechendes wo du das direkt reunladen kannst.



  • CTecs schrieb:

    Da du ja nix weiter zu deinen daten sagst und wie du die laden willst....

    Die Daten (Steuerungsinformationen für eine Demo SPS) existieren wie gesagt in einer .ild Datei, die keine Regelmässigkeit aufweisst und auch die Datei selber variiert. Mir wurde lediglich gesagt, dass ich aus dieser Datei, die mittels eines Dialogs oder so ähnlich geöffnet werden soll, die Teile heraus nehemen, verrechnen und im Buffersystem an den MCU senden muss.

    die Nutzdaten habe ich jetzt über die Erase-Funktion des Vectors heraus bekommen, und ich habe die Hexwerte auch schon separiert mit substring.

    Einziges Problem ist jetzt noch, dass ich die Informationen später an einen virtuellen Comport senden soll und dort müssen sie spätestens im char oder int Format sein.

    Jetzt bin ich aber noch auf ein anderes kleines Problem gestossen:
    Wie initialisiere ich in einer Schlaufe neu eine String Array, dessen Grösse ich erst bei der Laufzeit des Programmes kenne?

    string mystring_arr[] = new string mystring_arr[size];
    

    klappt irgendwie nicht

    MFG
    P51D


Log in to reply