PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++] ein String nach einer Bestimmten Zeichenkette in eine Variabel Speichern



deny
09-02-2005, 14:27
Hello Leute

Ich habe folgendes Problem:
Ich habe eine Textdatei die volgender massen aussieht:
[Files]
Param = ParamTDM.txt
String = StringTDM.txt
Baum = baumtext.txt

Nun habe ich volgenden Code:


string m_strParamFilePath;
string p = "Param";
string s = "String";

ifstream data(m_astrFilePath.c_str(), ios::in|ios::binary);
if (!data)
{
cerr << "Fehler beim Öffnen von der Datei" << endl;
}

string line;

while (!data.eof())
{
getline(data, line);

if(!line.find(p))
{
//Hier will ich den Dateinamen nach dem "=" abspeichern
}
if(!line.find(s))
{
//Hier dasselbe
}
}

Ich will jeweils die Dateinahmen nach dem '=' abspeichern, aber habe keinen schimmer wie ich dies lösen soll! :confused:

Vieleich könnt ihr mir ja weiter hellfen

gruss deny

Boron
09-02-2005, 15:44
Schau dir mal die Boost Library an (www.boost.org).
Dort gibt es eine recht gute Implemetierung für reguläre Ausdrücke (regex).

Diese könntest du verwenden um Strings zu zerpflücken.

SeeksTheMoon
09-02-2005, 15:51
Du liest die Datei einfach zeilenweise ein und wenn sie nicht mit [bla] beginnt, dann weißt Du, dass eine foo = bar Anweisung dort stehen sollte.
Du kannst den String "foo = bar" einfach am "="-Zeichen splitten und dir die beiden Teilstrings z.B. in einem Array ausgeben lassen:

stringarray = zeile.split("=");

dann ist stringarray[1] die rechte Seite, die Du haben willst.
Ich weiß nicht ob Du die STL oder eine andere Bibliothek verwendest, Du musst mal schauen ob Deine Lib eine split-Funktion bei der string-Verarbeitung hat, ansonsten musst Du die selber schreiben.

Wenn Du die Leerzeichen loswerden willst, dann wirst Du etwas wie ein trim-Funktion brauchen, die die Leerzeichen rausschneidet. Notfalls auch selber schreiben.

wraith
09-02-2005, 16:06
Wenn deine Zeilen immer so schön aufgebaut sind, mit Leerzeichen um '=', dann zb. so


string line;

while(getline(data,line))
{
stringstream stream(line);

string str1,str2;
char c;

if(stream >> str1 >> c >> str2)
cout << str2 << endl;
}

(du brauchst da noch den Header 'sstream')

deny
10-02-2005, 06:56
Hello leute

erst mal danke für die Antworten

@Boron
Ich Schau mir die Boost Library noch an danke

@SeeksTheMoon
Ich verwende die STL.

@wraith
Ich weiss dass das so gienge, die Textdatei ist schon immer so schön formatiert, aber es kann auch so aussehen:


[Files]
String = StringTDM.txt
Baum = baumtext.txtt
Param = ParamTDM.txt
Value = ValTDM.txt
Error = ErrorTDM.txt
Mode = ModeTDM.txt

Also beliebige reienvolge, und ich muss eben wissen ob dies jezt ein File ist mir Error oder mit Strings ist, den ich muss danch dann diese Dateien öffnen und muss sie dann weiterverwenden

Ich suche etwas, mit dem ich sagen kann so und so viel zeichen nach rechts und dann den String in eine Variabelkopieren oder einen TAB nach recht und........
Versteht ihr :confused:

Danke vielmals, werde jezt mal die Boost Library ansehen

gruss deny

deny
10-02-2005, 08:13
Hello

@Boron
Ich blicke da nicht ganz durch :eek:

Kann mir jemand ein Code beispiel geben, mit dem man dies machen kann was ich will? Vileicht Komentiert, dass ichs verstehe :)

gruss deny

Boron
10-02-2005, 08:21
Zugegeben, ich habe damit auch noch nie was gemacht :o.

Beispiele hat es hier: http://www.boost.org/libs/regex/doc/examples.html .
Unten in den "Code snippets" dürften die Brauchbarsten Sachen zu finden sein.

deny
10-02-2005, 08:29
ok danke, ich schau mal nach ;)

wraith
10-02-2005, 08:35
@wraith
Ich weiss dass das so gienge, die Textdatei ist schon immer so schön formatiert, aber es kann auch so aussehen:
[...]
Also beliebige reienvolge, und ich muss eben wissen ob dies jezt ein File ist mir Error oder mit Strings ist, den ich muss danch dann diese Dateien öffnen und muss sie dann weiterverwenden
Es fällt mir schwer hier jetzt die Probleme zu sehen.
Nach meinem obigen Code hast du in zb. in str1 = "String", in c = '=' und in str2 = "StringTDM.txt" stehen.
Darauf kannst du jetzt doch ganz einfache deine Überprüfungen loslassen if(str1 == "String") {...

Die Lösung mit boost::regex entspricht hier wohl mit Kanonen auf Spatzen zu schießen.

deny
10-02-2005, 08:42
Wie dumm von mir....habe das nicht geich gesehen :o
Ich löse dies jetzt so, aber natürlich wäre es eine schönere lösung, wenn man nur eine Variabel für den Dateinamen bräuchte, aber dies ist jetzt auch gut :D

Danke schön
Wünsch allen noch einen schönen Tag

gruss Deny

deny
11-02-2005, 14:22
Ich habe jetzt z.B. folgenen Text : $001.202 0 " Maschine 1 "

Wie kann man machen, dass mann mit stream >> usw. Maschine 1 als ganzes einlesen kann.

Habe momentan folgenden Code:


getline(stream,m_strTemp,'$');
stream >> m_nObjektnummer;
getline(stream,m_strTemp,'.');
stream >> m_nParameternummer >> m_strParameterwert >> m_strTemp >> m_strParameterBezeichnung;


Danke schon im voraus

gruss deny