einlesen einer datei in einen vector



  • Hallo zusammen

    ich sitze leider immer noch an meinem Problem, Daten aus einer .txt Datei in einen vector einzulesen. Das ist an sich ja weniger ein Problem, das kommt erst dadurch dass mein vector mit einer selbstdefinierten Punkteklasse gefuellt wird. Erschwert wird es dann noch dass ich mittendrin aus der Datei die Daten fuer meine Punkte holen muss, da die Datei auch noch andere Werte enthaelt. Also, hier mal Code zur Erklaerung:

    Mein Ascii-File:

    scale: 0
    size: 449
    #:-9.28698-3.48793-11.2223 -19.7867-14.669-20.9273 -3.11538-1.37863-16.9392 -8.2694-10.7538-31.6018 1.263-2.80125-16.9392 -0.0778647-13.4153-31.6018 -3.69872-7.03435-11.2223 -9.34507-21.2954-20.9273

    Meine PunkteKlasse:

    PointN::PointN()
    {
    	//data = NULL;
             //dim = 0;
    	data = new double[3];
    	for(int i = 0; i<3; i++)
    	{
    		data[i] = 0;
    	}
    
    	dim = 3;
    	invalid = false;
    }
    

    Der Istream-Operator:

    istream& operator>>(istream& in, PointN& p) 
    { 
    	int iDim = p.getDim();
    	for(int i = 0; i < 3; i++) 
    		in >> p[i]; 
    	return in;
    }
    

    Der Teil der load Funktion:

    if (szBuffer.find("#:",0) != string::npos)
    		{
    			vector<PointN>::size_type size = iBaseSize; 
    			vBasePoints.reserve(size); 
    
    			istream_iterator<PointN> pos1; // Anfangsiterator auf die Datei 
    			istream_iterator<PointN> iBaseSize; // Enditerator 
    			copy(pos1,iBaseSize,back_inserter(vBasePoints)); 
    		}
    

    Wenn ich das versuche steht nachher in meinem vBasePoints nichts drin. Woher kommt das? 😕

    Danke fuer eure Hilfe!



  • Erstens mußt du den Anfangs-Interator auch mit deiner Datei verknüpfen (indem du den Eingabestream im Konstruktor angibst.

    istream_iterator<PointN> start(fin);//lies aus Datei fin
    istream_iterator<PointN> ende;//Endemarke
    copy(start,ende,back_interter(vBasePoints)
    

    Und zweitens: Pass auf, ob nicht noch die ersten Koordinatenwerte in szBuffer eingelesen wurden.



  • O.k., was vielleicht noch fehlt aus meinem Code ist:

    ifstream file((szName).c_str());
    string::size_type pos1 = 0;
    string szBuffer;
    
    while (file)
    {
    		getline(file, szBuffer);
                      if (szBuffer.find("size: ",0) != string::npos)
    		{
    			szValue = szBuffer.substr(6,pos2);
    			iBaseSize = atoi(szValue.c_str());
    		}
    		if (szBuffer.find("#:",0) != string::npos)
    		{
    			vector<PointN>::size_type size = iBaseSize; 
    			vBasePoints.reserve(size); 
    
    			istream_iterator<PointN> pos1; // Anfangsiterator auf die Datei 
    			istream_iterator<PointN> iBaseSize; // Enditerator 
    			copy(pos1,iBaseSize,back_inserter(vBasePoints)); 
    		}
                       ........//weiterer Code
                       ........
    }
    

    Bis jetzt lese ich immer eine Zeile in einen Buffer und suche nach keywords, da ja, wie erwaehnt, nicht nur die Daten fuer meinen vector in der Datei stehen sondern noch andere Dinge. Die Frage ist jetzt, ob das so ueberhaupt geht oder nicht.



  • Samo schrieb:

    Bis jetzt lese ich immer eine Zeile in einen Buffer und suche nach keywords, da ja, wie erwaehnt, nicht nur die Daten fuer meinen vector in der Datei stehen sondern noch andere Dinge. Die Frage ist jetzt, ob das so ueberhaupt geht oder nicht.

    Gehen geht das schon. Die Frage ist, ob es nicht einfacher ist, im Prinzip gleich die Sachen so einzulesen, wie man sie braucht. Zum Beispiel:

    int main()
    {
        using namespace std;
        vector< PointN > vBasePoints;
    
        ifstream in( "input.txt" );
        int scale = 0;
        int sz = 0;
        for(;;)
        {
            std::string key;
            if( !getline( in, key, ':' ) )
                break;
            if( key == "scale" )
            {
                in >> scale;
            }
            else if( key == "size" )
            {
                in >> sz;
            }
            else if( key == "#" )
            {
                string zeile;
                getline( in, zeile );
                stringstream strm( zeile );
                copy( istream_iterator< PointN >( strm ), istream_iterator< PointN >(),
                    back_inserter( vBasePoints ) );
            }
            // else if( usw.
        }
        return 0;
    }
    

    Die Zeile mit den PointN's lese ich nur deshalb als ganzes ein, weil beim Einlesen von Zahlen das Zeilenende überlesen wird. Es sei denn, es ist definiert, wieviele PointN's in der Zeile stehen.

    Falls Du 'scale' und 'size' nicht benötigst, kannst Du auch ignore einsetzen.
    Gruß
    Werner


Anmelden zum Antworten