Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++] ein String nach einer Bestimmten Zeichenkette in eine Variabel Speichern
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
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.
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')
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
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
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.
ok danke, ich schau mal nach ;)
@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.
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.