Textdatei einlesen und Teile in Array speichern



  • Hallo Community,

    ich habe leider wenig Erfahrung in der Programmierung mit MFC C++ und versuche nun mein Glück 😉

    Ich habe eine Textdatei mit folgenden Aufbau:

    Ru=11012009
    Ge=234HJK
    44=hdjdh jdhdjd djdjdj djdjdk djdjd /hdjd ddd
    Be=-dfdfd dfdf dfds -dfdf /ff 6353 djdj

    Den Text lese ich ein und würde ihn nun gerne verarbeiten/zerlegen. In ein neues Array möchte ich einzelne Angaben aus der Textdatei schreiben:

    - den Eintrag hinter Ge=
    - den Eintrag hinter /ff

    leider kommt erschwerend hinzu, dass die Zeilenanzahl und Länge unterschiedlich sein kann.

    Folgendes habe ich bereits geschrieben:

    CString path("eingang.txt");  //Textdatei einlesen
    CStdioFile file; 
    file.Open(path,CFile::modeRead);   
    
    CStringArray stringArray;   //ZielArray anlegen
    
    CString strNewLine = _T("/ff");    //SuchString festlegen
    
     if (file.ReadString( strNewLine ))    //String druchsuchen
    	{
    	stringArray.Add(file(pos_start));   //Eintrag ins Array schreiben
    	return true;
    	} 
     else
       	{return false};   //war nicht dabei...
    

    Leider schaffe ich es nicht, den richtigen Eintrag in der vollen Länge ins Array zu schreiben. Ich habe sogar den Eindruck, dass ich mit ReadString das Array nicht durchsuche.
    Was mache ich falsch? Kann mir jemand helfen?

    Vielen lieben Dank!
    Grüße

    casi



  • Hallo,

    ReadString sucht nicht. Du kannst aber z.B. mit Left prüfen, ob die ersten drei Zeichen "Ge=" sind, und mit Mid den Rest dann holen, wenn Übereinstimmung:

    CString strNewLine;
    
    // alle Zeilen der Datei durchlaufen
    while (file.ReadString(strNewLine))
    {
       if (strNewLine.Left(3) == "Ge=")
       {
           stringArray.Add(strNewLine.Mid(3));
       }
    ...
    

    Für das "/ff" musst du suchen, z.B. mit Find:

    int pos;
    ...
    pos = strNewLine.Find("/ff");
    
    if (pos != -1)
    {
       //                                   3 Zeichen überspringen
       stringArray.Add(strNewLine.Mid(pos + 3));
    }
    

    MfG,

    Probe-Nutzer



  • VIelen Dank!
    Der "Ge=" scheint zu funktionieren.

    Gibt der Ausruck: strNewLine.Find("/ff"); ein Integer wieder? pos ist ja als solcher deklariert. Ist das die Position vom ersten Zeichen aus? Kann ich dann - bei gefunden /ff fest angeben, dass alle Zeichen bis zur nächsten Leerstelle (Anzahl der Zeichen hinter /ff ändert sich) ins Array geschrieben werden? Muss ich denn keine Array-Position angeben, damit ich mir in der while-Schleife die die eingetragenen Werte überschreibe?

    uih, das waren gleich 5 Fragen 🙂
    Vielen Dank nochmal für die fixe Hilfe.

    Grüße
    casi



  • Kann mir hierfür:

    Be=-dfdfd dfdf dfds -dfdf /ff 6353 djdj

    alles ausgeben lassen, wass hinter /ff steht und dann aber mit dem nächsten Leerzeichen vor djdj aufhört?

    Grüße
    casi



  • Zunächst noch zu den Fragen:

    Gibt der Ausruck: strNewLine.Find("/ff"); ein Integer wieder? pos ist ja als solcher deklariert. Ist das die Position vom ersten Zeichen aus?

    Das alles solltest du selber nachlesen, z.B. hier:

    http://msdn.microsoft.com/en-us/library/hz2099kw.aspx

    Wenn du dann (Verständnis-)Fragen dazu hast, dann ist das auch eine Foren-Frage wert.

    Muss ich denn keine Array-Position angeben, damit ich mir in der while-Schleife die die eingetragenen Werte überschreibe?

    Nein, denn ein CStringArray ist ein dynamisches Array, die Add-Methode sorgt dafür, dass nichts überschrieben wird, sondern immer ein Index-Wert hochgezählt wird, und der Wert an die nächstfolgende Array-Position geschrieben wird. Da du CStringArray verwendest, bin ich natürlich davon ausgegangen, dass du auch weisst, wie das funktioniert, aber, das kann man auch noch genauer nachlesen.

    Kann mir hierfür:

    Be=-dfdfd dfdf dfds -dfdf /ff 6353 djdj

    alles ausgeben lassen, wass hinter /ff steht und dann aber mit dem nächsten Leerzeichen vor djdj aufhört?

    Geht alles. Um auf meinem Code aufzubauen, kann man mit Tokenize das Ergebnis von Find noch "zerlegen":

    int pos;
    ...
    pos = strNewLine.Find("/ff");
    
    if (pos != -1)
    {
       CString ergebnis = strNewLine.Mid(pos + 3);
       // jetzt haben wir " 6353 djdj" in ergebnis
       pos = 0; // pos zuruecksetzen fuer Tokenize
       CString trennzeichen = " "; 
       ergebnis = ergebnis.Tokenize(trennzeichen, pos);
       // jetzt sollte "6353" in ergebnis sein
       // Tokenize 
    }
    

    MfG,

    Probe-Nutzer



  • Vorab vielen Dank für die Hilfe!
    Bin fleißig dran am werkeln 😉

    gruß
    casi


Anmelden zum Antworten