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 7

    wenn 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?


Anmelden zum Antworten