Datei auslesen und Wörter überspringen



  • Kann mir dabei keíner helfen, nur jedes zweite Wort auszugeben? Wenns nicht geht, kann das | da ruhig bleiben, dass kann ich dann per Hand wegmachen...

    Danke im vorraus!



  • Willst du wirklich jedes zweite Wort? Also bei der obersten Zeile so:

    a bank of|eine Reihe von|

    bank eine von

    oder

    a of Reihe

    Dann musst du auf Leerzeichen achten und Buchstabenweise schreiben oder eben nicht.

    Oder willst du entweder den Teil vor oder nach dem |?

    Wo das | ist, findest du mit Find, und rauskopieren geht mit Left bzw. Right.

    Aber solange dein Problem mit dem Replace nicht behoben ist, kannst du auch diese Funktionen nicht benutzen. 😞

    CString als Typ ist Vorraussetzung, dass es überhaupt funktioniert!

    Drück einfach mal "Alles neu erstellen" - das hilft bei komischen Fehlern. 😃



  • Hast natürlich recht, ich will die verschiedenen Blöcke, also z.B. nur die Englischen Wörter haben (also soll er "a bank of" ausgeben).

    Habe alles neu kompilieren gedrückt, der Fehler war jedoch immernoch da 😞

    Wie würde denn der Code für diese Find und Left,Right Funktion lauten?
    -Wo das | ist, findest du mit Find, und rauskopieren geht mit Left bzw. Right.

    Danke!



  • Hey, ein bischen was musst du auch alleine machen... 😉
    Ist wirklich nicht schwer. (Ich müßte es auch erstmal selber entwickeln - keine Zeit...)

    Guck mal in die MSDN. Dort suchst du dir die Klasse CString und dann die 4 Funktionen, die wir dir schon geschrieben haben. Wenn du mit den Erklärungen nicht klar kommst, kannst du ja nochmal fragen. 🙂



  • int pos=stroutput.Find("|");
    CString english = stroutput.Left(pos);
    CString german = stroutput.Right(pos);

    Müßte klappen, hab's selber noch nicht ausprobiert...
    beim deutschen Wort dürfte das |-Zeichen noch dabei stehen,
    kann man das vorab irgendwie wegformatieren?



  • Yvonne schrieb:

    int pos=.Find("|");
    CString english = str_output.Left(pos);
    CString german = str_output.Right(pos);

    Müßte klappen, hab's selber noch nicht ausprobiert...
    beim deutschen Wort dürfte das |-Zeichen noch dabei stehen,
    kann man das vorab irgendwie wegformatieren?

    Ich würde es beim Kopieren weglassen:

    CString german = str_output.Right(pos+1);
    

    Und wenn man Mid benutzt, kann man das ganz hinten auch gleich weglassen. Oder es funktioniert doch mit Replace('|', '');



  • So ganz verstehe ich die Funktion von Mid nicht...
    gebe ich damit die Positionen des substrings an, den ich haben will?
    (also Anfang und Länge des substrings?)



  • Genau. 🙂

    CString strText = "Käsekuchen";
    CString strMid = strText.Mid(4, 5); // Nun sollte da "kuche" drin stehen, wenn ich mich nicht vertan habe...
    


  • Danke, es geht mit dem left und right befehl! Die | werden auch nicht angezeigt.

    Der Code sieht jetzt so aus:

    CString strOutput;
    int pos;
    CStdioFile stdFileInput("C:\\1.txt", CStdioFile::modeRead); 
    
    while (stdFileInput.GetPosition() < stdFileInput.GetLength()-1) 
    { 
      stdFileInput.ReadString(strOutput);
    	pos=strOutput.Find("|"); 
    CString english = strOutput.Left(pos); 
    CString german = strOutput.Right(pos); 
    
      m_ctlEn.AddString(english); 
      m_ctlDe.AddString(german);
    } 
    
    stdFileInput.Close();
    

    Jetzt stehen in einem Listenfeld die deutschen im anderen die englishen Wörter. Jetzt müsste ich noch wissen, wie man es macht, dass die Wörter, die in einer Zeile stehen, auch in den Feldern nebeneinander sind und nicht sortiert werden!

    Wie würde es jetzt gehen, dass ich da eine Spalte hinzufüge? Also, angenommen das ist die txt datei:

    english1|deutsch1
    english2|deutsch2
    abc|def
    test1|Test2
    ape|Affe

    wenn ich jetzt hinter jedem Wort (jeder Zeile) noch ein | einfüge und dahinter eine Beschreibung hinzufügen will?
    Also:ape|Affe|An ape is an animal.

    Kann mir da jemand helfen?



  • Das Sortieren kannst du in den Resourcen abschalten, ist ein Häkchen.

    Wenn du mit drei Spalten arbeiten willst, kannst du es genauso machen, nur dass du den Englischen nochmal zerhacken musst. 🙂
    Alles mit den Befehlen die du schon hast.



  • Wie meinst du das, zerschnibbeln? Ich meine es gibt ja nur LEft und Right... Oder gibt es auch noch nen Middle 😉 Kannste vielleicht ein kleines Beispiel posten? Danke für das mit dem sortieren, habe ich übersehen...



  • Ist ehrlich ungetestet - hoffe du erkennst was ich meine:

    stdFileInput.ReadString(strOutput); 
        pos=strOutput.Find("|"); 
    CString english = strOutput.Left(pos); 
    CString Rest = strOutput.Right(pos); 
    pos = Rest.Find("|");
    CString german = Rest.Left(pos);
    CString sentence = Rest.Right(pos);
    


  • Hört sich gut an, schmeckt ihm aber nicht 😞 Habe das übernommen, jedoch zeigt er nur die englischen Wörter an, die anderen beiden nicht...

    Der Code sieht bis jetzt so aus:

    CString strOutput;
    int pos;
    CStdioFile stdFileInput("C:\\1.txt", CStdioFile::modeRead); 
    
    while (stdFileInput.GetPosition() < stdFileInput.GetLength()-1) 
    { 
      stdFileInput.ReadString(strOutput); 
        pos=strOutput.Find("|"); 
    CString english = strOutput.Left(pos); 
    CString Rest = strOutput.Right(pos); 
    pos = Rest.Find("|"); 
    CString german = Rest.Left(pos); 
    CString sentence = Rest.Right(pos);  
    
      m_ctlEn.AddString(english); 
      m_ctlDe.AddString(german);
      m_ctlBsp.AddString(sentence);
    } 
    
    stdFileInput.Close();
    

    Wie gesagt, es wird nur das Listenfeld english angezeigt 😞

    Kannst du mir helfen (oder jemand anders)?

    danke!



  • Tja, komisch, dass es vorher mit den zwei Spalten funktioniert hat. 😕

    Right wurde falsch benutzt, so ist es besser:

    pos=strOutput.Find("|"); 
    	CString english = strOutput.Left(pos); 
    	CString Rest = strOutput.Right(strOutput.GetLength() - pos - 1); 
    	pos = Rest.Find("|"); 
    	CString german = Rest.Left(pos); 
    	CString sentence = Rest.Right(Rest.GetLength() - pos);
    

    Jetzt musst du noch das Replace machen und gut ist.



  • Macht spass, mit dir zu arbeiten 😉 Jedoch gibt es da immernoch ein Prob...

    CString strOutput;
    int pos;
    CStdioFile stdFileInput("C:\\1.txt", CStdioFile::modeRead); 
    
    while (stdFileInput.GetPosition() < stdFileInput.GetLength()-1) 
    { 
      stdFileInput.ReadString(strOutput); 
    
    	pos=strOutput.Find("|"); 
        CString english = strOutput.Left(pos); 
        CString Rest = strOutput.Right(strOutput.GetLength() - pos - 1); 
        pos = Rest.Find("|"); 
        CString german = Rest.Left(pos); 
        CString sentence = Rest.Right(Rest.GetLength() - pos);
    	sentence.Replace('|', ' ');
    
      m_ctlEn.AddString(english); 
      m_ctlDe.AddString(german);
      m_ctlBsp.AddString(sentence);
    } 
    
    stdFileInput.Close();
    

    So sieht der Code aus, jedoch (wie schon vorher auch) kommt eine Fehlermeldung:
    error C2039: 'Replace' : ist kein Element von 'CString'

    Ausgegeben wird jetzt alles im richtigen Listenfeld, jedoch ist bei den Beispielen immmernoch das | davor 😡

    Danke, für deine Hilfe! 👍



  • Wenn es nur DAVOR ist, dann lass es doch gleich beim kopieren weg. 😃

    CString sentence = Rest.Right(Rest.GetLength() - pos - 1);
    


  • Yo, es geht 🙂 Wäre ich gar nicht drauf gekommen, danke für deine Hilfe
    😉
    PK01

    P.S.I´ll be back ⚠



  • SetAt müßte gehen.

    Also
    sentence.SetAt(sentence.GetLength()-1,' ');

    Gruß
    Yvonne



  • Sorry, habe nicht gesehen, daß es schon eine dritte Seite gibt...



  • Aber ich hätte noch eine Frage zu dem Ausdruck
    GetRight(strOutput.GetLength() - pos - 1);

    Wenn strOutput angenommen 20 Zeichen hat und das erste | ist an Position 5, dann müßte doch eigentlich als Rest alles rechts von Position 14 (20-5-1) zurückgegeben werden und nicht rechts von Position 5 oder?
    Aber trotzdem kommt das richtige raus, kann mir jemand erklären wieso, bzw. wo liegt mein Denkfehler?


Anmelden zum Antworten