string anhand Trennzeichen aufspalten

Krikus

Mitglied
Hi,

ich lese eine Textdatei zeilenweise als String ein.
Dieser String wird in der Variablen buffer gespeichert.


Der eingelesene String sieht wie folgt aus:

test,222,333

Nun würde ich gerne anhand des Kommas diesen Text aufteilen, sodass ich folgendes habe:
C++:
string test1=test;
int test2=222;
int test3=333;

Wie kann ich diesen String nun aufspalten?

Hier einmal der Rahmen:

C++:
void read_from_textfile()
{
	string buffer;
	ifstream textfile;                // Quelldatei (Lesen)          
    textfile.open("textfile.txt", ios::in); // zum Lesen öffnen
    if (!textfile) {                  // Datei kann nicht geoeffnet werden
		cerr << "textfile.txt" << " kann nicht geoeffnet werden!\n";
	}else{
		while(!textfile.eof()){
			getline(textfile,buffer);

//hier müsste die Aufsplittung erfolgen

        	if (consist_of(buffer)==false)
				ins(buffer);		
		}   
	}
	textfile.close();
}
Gruß

Krikus
 
Zuletzt bearbeitet:
Heey,

du könntest auch anstelle der ganzen Zeile nur bis zu dem Komma auslesen.
Im dritten Parameter von getline kann ein trennzeichen übergeben werden.
Dann musst du das noch den variablen zuordnen und fertig.

Wenn du ein Codebeispiel brauchst meld dich nochmal.

LG Nino
 
Moin,

google mal nach den Begriff "reguläre Ausdrücke"!
Habe im Moment leider kein Beispiel für C++ zur Hand, aber das wird genau das sein, was Du suchst!

Wir nutzen hier in der Firma zum Testen von regulären Ausdrücken das nette kleine
Tool "RegEx coach"! Es kann zusammen mit seiner Doku hier runtergeladen werden:
http://weitz.de/regex-coach ("Windows installer" oder "Linux tar archive")

Gruß
Klaus
 
Hi.

Da reguläre Ausdrücke (noch) nicht Teil von C++ sind müßte man dafür eine zusätzliche Bibliothek installieren (z.B. Boost.Regex).

Oder man sucht einfach mal hier im Forum? :eek:

Evlt. passt ja ein auch gleich eines der "ähnlichen Themen" ?

Gruß
 
Moin,

jau, deepthroat hat Recht!
Habe hier eben mal geschaut und gesehen, dass in meinen Projekten ein Header namens "regexpr2.h" eingebunden ist. Dieses scheint lt. Copyright zwar von Microsoft zu kommen, allerdings habe ich keine Ahnung, wo mein Vorgänger sich den gezogen hat, da in seinem alten Download-Verzeichnis nichts zu finden ist! :rolleyes:

Aber die Boost-LIBs sind sicher auch die bessere (und aktuellere;)) Wahl!

Gruß
Klaus
 
Moin,

das mit den Boost-LIBs hört sich interessant an.
Auf dem heimischen Rechner könnte ich damit wohl arbeiten.
Allerdigns wenn ich die Klausur schreibe, und ich so etwas machen muss, lässt mich mein Prof wohl kaum die Libs nach installieren.
Somit muss etwas anderes her.
 
Moin,

achso - Klausur - verstehe .....

Tja, dann bist wieder bei einer guten alten Schleife und quasi dem Vorschlag von Nino14 :rolleyes:

Mal flapsig ausgedrückt:
String zeichenweise nach den Trennzeichen durchsuchen und alles was nicht Trennzeichen ist, ist geeignete Variablen speichern ;-]
Ich hoffe, Du weißt was ich meine ...

Gruß
Klaus
 
Hm wofür ließt du es erstmal Zeilenweise ein? Und wenn du das gemacht hast mach es dann wenigstens mit nem Stringstream ...
 
Ich habe mal was gebastelt.
Sieht zwar nicht schön aus, funktioniert aber bis auf eine Sache.

Und zwar muss der vector in jedem Schleifendurchlauf wieder gelöscht bzw. geleert werden, damit der Inhalt immer an der Stelle 0,1,2 steht. Dieses löschen bekomme ich nicht hin.

Ich hatte es auch schon einmal anders Probiert, aber dann hatte ich immer das Problem mit einem "Vector Out of Range".

Hier mal der BastelCode:

C++:
void read_from_textfile()
{
	string line;
	string token;
	stringstream iss;
	vector<string> inhalt;
	int x_ko;
	int y_ko;
	ifstream textfile;                // Quelldatei (Lesen)          
    textfile.open("textfile.txt", ios::in); // zum Lesen öffnen
    if (!textfile) {                  // Datei kann nicht geoeffnet werden
		cerr << "textfile.txt" << " kann nicht geoeffnet werden!\n";
	}else{
		while(!textfile.eof()){
			getline(textfile,line);
			iss << line;
			while(getline(iss,token,','))
			{
				inhalt.push_back(token);
			}
			iss.clear();
        	if (consist_of(inhalt[0])==false)
			{
				// String -> Int
				stringstream sstr(inhalt[1]);
				sstr >> x_ko;
				stringstream sstr2(inhalt[2]);
				sstr2 >> y_ko;
				ins(inhalt[i], x_ko, y_ko);	
			}

			//Vektor Inhalt wieder löschen
			
			
		}   
	}
	textfile.close();
}
 
Hi.
C++:
		while(!textfile.eof()){
			getline(textfile,line);
Warum verwendest du die eof() Methode? Woher willst du wissen ob auch wirklich etwas eingelesen wurde? 2 Zeilen später machst du es doch auch richtig?!
C++:
			//Vektor Inhalt wieder löschen
Wie wär's mit der clear() Methode?

Aber warum willst du das überhaupt explizit machen? Warum definierst du den Vektor und den Input Stringstream am Anfang der main Funktion? Wenn du die Variablen nur im Skopus der Schleife definierst, dann werden diese automatisch bei jedem Schleifendurchlauf neu initialisiert (was nebenbei oft noch effizienter ist).

Gruß
 
Zurück