Text in String-Variable in Zeilen aufteilen



  • Nachdem ich meine Frage wohl im falschen Thread gestellt habe, hier nochmal von Anfang an.

    Also:

    Ich Lese aus einer Flugsimulationssoftware die Flugdaten in einen String ein,
    diese sehen dann so aus:

    "string Daten;"

    time=12.0111996706285
    airspeed=22.0635795593262
    altitude=2043.95642089844
    vario=-0.000195638305740431
    compass=270
    slipball=0
    turnrate=0
    yawstringangle=-0.0215568039566278
    radiofrequency=123.5
    yaw=4.71238899230957
    pitch=0
    bank=0
    quaternionx=0
    quaterniony=0
    quaternionz=9.73535918546986E-8
    quaternionw=1
    ax=0
    ay=0
    az=0
    vx=25
    vy=-4.07301695304341E-6
    vz=0
    rollrate=-0.00339330825954676
    pitchrate=0
    yawrate=0
    

    Dann möchte ich jede Zeile in einer eigenen Stelle eines Arrays speichern.

    string Zeilen[25];

    Und zu guter letzt die nur die Werte nacheinander in einen Array speichern.

    float Werte[25];

    Aus dem ich mir dann die Werte holen kann, wenn ich sie brauche...

    Das ist mein Ansatz:

    string Daten;
    string Zeilen[25];
    
    for(int loop=0; loop<25; ++loop)
    {
        string Zeile[loop] = ??????????????????;
    }
    

    Ich hoffe ich konnte es einigermaßen verständlich rüberbringen,
    vielen Dank für eure Geduld mit mir! 😉

    Gruß,
    Freddy



  • Ich möchte hier nochmal auf meinen Vorschlag bezüglich der Verwendung von map<string, int> aus dem alten Thread verweisen. Ansonsten wäre es gut zu wissen, was genau du hier wissen willst?



  • Hallo

    Datei mit TStringList öffnen, dadurch werden Zeilen werden automatisch getrennt. Zugriff über die Eigenschaft Strings[], manuelles kopieren in Array.

    Wobei ich die Nützlichkeit eines einfachen C-Arrays bezweifle. Verwende std::map<string,string> um die Werte im Format <Name,Wert> zu speichern. Oder (wenn die Datenmenge und -bezeichnung immer gleich ist) gleich ein richtiges typsicheres struct wo jeder Wert seine eigene Membervariable hat.

    bis bald
    akari



  • f.sp schrieb:

    "string Daten;"

    Ist das die C++-String-Klasse?



  • Schreib Dir die Daten in eine StringList, dann kannst Du sogar mit TStringList::Names und TStringList::Values arbeiten. Dazu sollte es völlig ausreichen, den String der Eigenschaft TStringList::Text zuzuweisen. Bei jedem Zeilenumbruch sollte automatisch eine neue Zeile in der Stringlist angelegt werden. Für die StringList gilt dann wieder das gleiche, wie für das RichEdit in dem anderen Thread.



  • Sorry, ich bin glaub einfach zu blöd, ich finde weder im Forum noch in der BCB-Hilfe ein geeignetes Beispiel an dem ich verstehe wie ich die TStringList verwende... 😕

    Ich habe jetzt oben noch meinen Ansatz eingefügt, könnt ihr mir dadran vielleicht erklären wie ich die TStringList verwenden kann?

    Wäre echt Super!

    string Daten;
    string Zeilen[25];
    
    for(int loop=0; loop<25; ++loop)
    {
        Zeilen[loop] = ??????????????????;
    }
    


  • Hallo

    Ohne Kommentar...

    TStringList* file = new TStringList();
    file->LoadFromFile("Dateiname");
    for (int lv = 0; lv < file->Count; lv++)
      ... = file->Strings[lv];
    delete file;
    

    bis bald
    akari



  • hier ist noch interessant die von Joe angesprochenen StringList::Names, TStringList::Values zu verwenden.



  • Es ist immer noch das Problem dass die Daten nicht in einer Datei sondern in einer Variable liegen...



  • TStringList* file = new TStringList();
    file->Text = Daten.c_str(); // oder so ähnlich
    for (int lv = 0; lv < file->Count; lv++)
      ... = file->Strings[lv];
    delete file;
    


  • Hallo

    Wenn "Daten" ein AnsiString oder C-String ist brauchst du nichtmal das c_str()

    /Edit : offenbar ist es doch ein std::string

    bis bald
    akari



  • In dem Fall, wenn die Zeilenumbrüche mit drin sind und die Variable ein string ist

    string text;
    // irgendwie gefüllt
    TStringList* file = new TStringList();
    file->Text = text.c_str();
    

    [edit]Viel zu spät. 🙂 [edit]



  • Irgendwie reden hier alle aneinander vorbei. Liegt aber auch daran, dass f.sp meine Frage oben nicht beantwortet hat.



  • Also ich han jetzt mal ein kleines Testprogramm geschrieben...

    #include <iostream.h>
    
    void main()
    {
    string Eingang = "dasfakshf sdajhfkajsf \n asdhfjhaskdfh adfsjlaskjfd \n sdafjlasjkdf sdfkjalks";
    
    TStringList* Daten = new TStringList();
    Daten->Text = Eingang.c_str();
    string Zeilen[3];
    
    for(int loop=0; loop<3; ++loop)
    {
        Zeilen[loop] = Daten->Strings[loop];
    }
    
    getchar();
    }
    

    Muss ich für die TStringList noch eine Headerdatei einbinden?

    ich bekomme immer die Fehlermeldungen:

    [C++ Fehler] Unit1.cpp(6): E2451 Undefiniertes Symbol 'TStringList'
    [C++ Fehler] Unit1.cpp(6): E2451 Undefiniertes Symbol 'Daten'
    [C++ Fehler] Unit1.cpp(6): E2303 Typname erwartet
    [C++ Fehler] Unit1.cpp(6): E2379 In Anweisung fehlt ;
    

    Gruß,
    Freddy



  • Hallo

    Also echt, kannst du nicht von Anfang an sagen das du ein Konsolenprogramm ohne VCL-Unterstützung haben wilst?!
    Entweder must du noch

    #include <vcl.h>
    

    hinzufügen oder besser noch du beschränkst du weiterhin auf Standardmittel wie std::stringstream und std::getline.

    /Edit : Und am besten gleich noch ein Grundlagentutorial zum Thema Standardkonformes C++ durcharbeiten.

    bis bald
    akari


Log in to reply