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 djdjDen 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 /ffleider 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üßecasi
-
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 werkelngruß
casi