eine zeile in einen vector einlesen
-
hallo
ich habe das problem, dass ich aus einer datei viele zahlen in ein 2d-array einlesen soll. in der datei sieht das so aus:
0 0 0 0 0 0 4 1 1 0 1 1 1 1 0 0 2 1 0 1 0 1 1 0 0 0 1 3 0 1 ...
gibt es eine möglichkeit, so eine ganze linie auf einmal dem vector zuzuweisen?
besten dank
-
Du liest die Zeile der Datei doch in einen char* oder?
Wenn ja, kannst du mit strtok die Zeile in ihre einzelnen Elemente zerlegen und diese dann dem vector zuweisen.
-
vector<vector<string> > vec2d; for (string line; getline(filestream, line)) { istringstream linestream(line); vec2d.resize(vec2d.size() + 1); copy(istream_iterator<int>(linestream), istream_iterator<int>(), back_inserter(vec2d.back())); }
Ungetestet, sollte vom Prinzip her aber so gehen
-
hallo
thx für die antworten.
zu beiden hätte ich fragen:1)zu strtok():
pch = strtok (temp.c_str()," ");
temp ist ein string... jetzt bekomme ich die fehlermeldung, dass bei strtok parameter 1 nicht von char* zu const char* konvertierbar sei. geht strtok nicht mit einem string?
hab das ganze noch nicht ganz durchblickt:) was macht die zeile 'istringstream linestream(line);'?
und ist der vector danach genau so angeordnet, wie in der datei?cu
-
nochwas:
bei variante 2 bekomme ich folgenden fehler:error C2079: 'linestream' verwendet undefiniertes class 'std::basic_istringstream<_Elem,_Traits,_Alloc>'
-
Erstmal ist mir gerade aufgefallen, dass mein Code so keinen Sinn ergibt. Wenn du Zahlen einlesen willst, muss vec2d als vector<vector<int> > deklariert sein (nicht v<v<string> >), und es muss nach dem getline() noch ein Semikolon ergänzt werden. Außerdem braucht der Schnipsel zusätzlich zu <vector> etc. noch <iterator>, <algorithm> und <sstream>. Davon abgesehen bin ich einfach mal davon ausgegangen, dass du schon einen offenen Dateistream namens filestream hast.
"istringstream linestream(line);" definiert einen Stream namens linestream, der direkt aus dem String line liest (statt z.B. aus einer Datei), der wiederum vorher über getline eingelesen wurde. Alles über istringstream, back_inserter und istream_iterator kannst du in der Dokumentation deines Vertrauens nachlesen.
-
datei in vector schrieb:
...
1)zu strtok():pch = strtok (temp.c_str()," ");
temp ist ein string... jetzt bekomme ich die fehlermeldung, dass bei strtok parameter 1 nicht von char* zu const char* konvertierbar sei. geht strtok nicht mit einem string?
...Hier mal die verwendung von "char *strtok( char *strToken, const char *strDelimit );".
Kann es evtl sein, daß Du temp als const definiert hast?Hier mal ein Bsp von mir.
LPCTSTR Reg321::ReadString(file_handle &my_handle) { char komma[]=" /="; //token string my_handle.token = strtok( NULL, komma ); //wenn schon einmal strtok aufgerufen wurde if(strstr(my_handle.token,"*")) { fgets(my_handle.line_buf, BUFSIZE, my_handle.stream); CopyLine(my_handle); //kopiert eine Zeile (für Dich unwichtig) my_handle.token = strtok( my_handle.line, komma ); //wenn strtok zum erstenmal aufgerufen wird } return my_handle.token; }
-
operator void schrieb:
Erstmal ist mir gerade aufgefallen, dass mein Code so keinen Sinn ergibt. Wenn du Zahlen einlesen willst, muss vec2d als vector<vector<int> > deklariert sein (nicht v<v<string> >), und es muss nach dem getline() noch ein Semikolon ergänzt werden. Außerdem braucht der Schnipsel zusätzlich zu <vector> etc. noch <iterator>, <algorithm> und <sstream>. Davon abgesehen bin ich einfach mal davon ausgegangen, dass du schon einen offenen Dateistream namens filestream hast.
"istringstream linestream(line);" definiert einen Stream namens linestream, der direkt aus dem String line liest (statt z.B. aus einer Datei), der wiederum vorher über getline eingelesen wurde. Alles über istringstream, back_inserter und istream_iterator kannst du in der Dokumentation deines Vertrauens nachlesen.
so hab ich das übernommen:
for (;getline(iflevel, temp);) { istringstream linestream(temp); daslevel.hintergrund.resize(daslevel.hintergrund.size() + 1); copy(istream_iterator<int>(iflevel), istream_iterator<int>(), back_inserter(daslevel.hintergrund.back())); }
In der Datei steht folgendes:
0 1 2 3 4 5
9 7 8 9 0 1
2 3 4 5 6 7wenn ich das jetzt mit dieser funktion einlese funktioniert das so halb. daslevel.hintergrund[0][0] ist 9, [0][1] ist 7 usw. also eine zeile zu weit...
besten dank übrigens an euch beide für die beispiele.
-
Komisch. Ich habe mein Schnipsel gestern mal kompiliert und es ging problemlos. Kannst du mal mehr Kontext posten?