string split (ohne boost)
-
Hallo,
heute möchte ich eine Zeile aus einer Textdatei lesen (das kann ich nun schon), welche mehrere int-Werte enthält. Diese sind durch Kommata getrennt.
Ich habe nun schon viel gegoogelt, aber nichts brauchbares gefunden. strtok ist anscheinend ausschließlich für char-Arrays (?) - die mag ich aber nicht
. Ich würde die Zeile gerne als string einlesen und die einzelnen int dann in ein Array packen.Habt ihr Hinweise?
Danke im Voraus!
-
Ungefähr so:
string str = "12, 14, 1290";
String in einen Stream packen:
stringstream ss(str);Vektor für int erstellen (statt eines rohen Arrays):
vector<int> iVec;Vektor füllen:
int temp;
while(ss >> temp)
{
iVec.push_back(temp);
Komma überlesen:
char c;
ss >> c;
}Edit:
Vektor wieder ausgeben:
for(int i = 0; i < iVec.size(); ++i)
{
cout << iVec[i] << '\n';
}
-
OK, funktioniert, aber ich verstehe nicht, wo genau deklariert wird, dass ein Komma ausgelassen wird?
EDIT: bzw. wie kann ein leeres char dafür sorgen?
-
Da wo der Kommentar 'Komma überlesen' in meinem Posting steht. Dort wird ein Zeichen mittels ss >> c; 'weggelesen'. Leerzeichen, Tabulatoren und sonstige Whitespace-Zeichen werden standardmäßig vom >> Operator sowieso überlesen, so dass wegen der Definition von c als char genau ein Zeichen gelesen, in c gespeichert und nicht weiter verwendet wird, aber aus dem Stream ist es damit raus, so dass es mit dem nächsten int weitergehen kann.
-
Das verstehe ich.

Nun würde ich das ganze gerne aber doch als array machen, da das ganze Bestandteil einer Klasse werden soll. Gibt es Möglichkeiten, ein ganz normales Array ( int array[10]; ) auch dynamisch zu definieren ( int array[x]; )?Den Code habe ich mir dementsprechend umgebaut, nur beim initialisieren eines Arrays per Variable, die ja erst zur Laufzeit steht, gibts natürlich 'nen error...
1> main.cpp \codetest\main.cpp(29): error C2057: Konstanter Ausdruck erwartet \codetest\main.cpp(29): error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich. \codetest\main.cpp(29): error C2133: 'intarray': Unbekannte Größe
-
thuering schrieb:
Das verstehe ich.

Nun würde ich das ganze gerne aber doch als array machen, da das ganze Bestandteil einer Klasse werden soll.Na und? Wieso kann nicht der Vektor Bestandteil der Klasse werden? Wenn Du ein rohes Array dynamisch halten willst, musst Du mit malloc selbst Speicher in der erforderlichen Größe dafür anfordern, UND später auch wieder freigeben. Du kannst Dir da - gerade mit relativ wenig Erfahrung - schnell Probleme mit Arraygrenzen und/oder Memoryleaks einhandeln.
Solange nichts gegen Nutzung eines Vektors oder sonstigen STL-Containers spricht, solltest Du einen solchen benutzen.
-
string income = "hallo,hallo,hallo"; vector<string> arguments; string buffer; stringstream incometest(income); getline(incometest,buffer, ',' ); arguments.push_back(buffer);
-
In etwa so (ungetestet):
std::vector<int> v; boost::spirit::qi::phrase_parse(begin, end, int_ % ',', boost::spirit::ascii::space, v);
-
314159265358979 schrieb:
In etwa so (ungetestet):
std::vector<int> v; boost::spirit::qi::phrase_parse(begin, end, int_ % ',', boost::spirit::ascii::space, v);string split (ohne boost)
-
Ups. Wie peinlich.
@TE: Gibt es eigentlich einen Grund, der gegen boost spricht? Wie du siehst ist das ziemlich elegant gelöst in Spirit.
-
Ich kenne boost überhaupt nicht, bzw. nur vom Hörensagen. Wie lange würde ich wohl benötigen, wenn ich mir das nun installieren würde, bis ich diese tolle, elegante Lösung gefunden hätte?
-
Nicht lange, Spirit ist Header-only

-
Ob nun Boost oder nicht - dann mache ich das jetzt mit einem Vector.
Allerdings habe ich dann wieder Fragen.{ ifstream file(datei); getline(file, MonsterName); getline(file, MonsterRasse); getline(file, MonsterKlasse) >> MonsterTP >> MonsterAC >> MonsterTHAC0 >> MonsterWeapon >> MonsterIniMod >> MonsterMinAnzahl >> MonsterMaxAnzahl >> MonsterXP >> MonsterGroesse; getline(file, MonsterAngriffe); } stringstream ss(MonsterAngriffe); vector<int> vec_temp; int temp; while(ss >> temp) { vec_temp.push_back(temp); char c; ss >> c; } //GegnerV ist auch ein Vector, welche Objekte der Klasse Enemy beinhalten kann //Also Vector in Vector - geht das? GegnerV.push_back(Enemy(MonsterName,MonsterRasse,MonsterKlasse,MonsterTP,MonsterAC,MonsterTHAC0,MonsterWeapon,MonsterIniMod,MonsterXP,MonsterGroesse,vec_temp));Die erste Frage ist nun, ob der Konstruktoraufruf in der untersten Zeile so funktioniert (man beachte "vec_temp") - was verlangt ein vector<int> in einem Konstruktur der darüberstehenden Klasse als Eingabe?
EDIT: "Enemy" ist eine Klasse.
nochmal der Inhalt der ausgelesenen Datei:Gruener Drache (Nestling) Gruener Drache Gruener Drache 36 3 7 13 3 1 1 1400 4 100, 100, 101, 201EDIT 2: In der Klasse Enemy ist der (auch über den Konstruktor der Klasse aufrufbare) Vector so deklariert:
vector<int> attacks;