Wertetabelle aus Datei mit unbekannter Größe auslesen



  • Das Puffern der Zeile ist völlig überflüssig.

    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <iterator>
    #include <algorithm>
    
    int main()
    {
    	using namespace std;
    
    	istringstream stream{"4 8 6 5 7 1 2 8"}; // Ob die beiden Paare durch einen Zeilenumbruch getrennt sind oder nicht, ist irrelevant. 
    // (Ich nehme an, die Zeilenumbrüche sind in der Datei nur der Lesbarkeit wegen?)
    
    	vector<double> x_vector, 
    	               y_vector; // Die beiden vectors.
    
    	double x, y;
    	while( stream >> x >> y )
    	{
    		x_vector.push_back(x);
    		y_vector.push_back(y);
    	}
    
    	// Ausgabe
    	copy( begin(x_vector), end(x_vector), ostream_iterator<double>{cout << "X: ", " "} );
    	copy( begin(y_vector), end(y_vector), ostream_iterator<double>{cout << "Y: ", " "} );
    }
    

    Edit: Furble war schneller.

    Mir dünkt Du willst eigentlich Positionen auslesen, oder Koordinaten, oder Tupel - jedenfalls zwei Werte, die zusammen einen Sinn ergeben.

    👍



  • std::istream& operator>>(std::istream& in, position_table& positions){
      pos p;
      while(in>>p)
        positions.push_back(p);
      return in;
    }
    

    ➡

    std::istream& operator>>(std::istream& in, position_table& positions)
    {
      std::copy( std::istream_iterator<pos>(in), std::istream_iterator<pos>(), std::back_inserter(positions) );
      return in;
    }
    

    (Ungetestet)



  • Sone schrieb:

    std::istream& operator>>(std::istream& in, position_table& positions){
      pos p;
      while(in>>p)
        positions.push_back(p);
      return in;
    }
    

    ➡

    std::istream& operator>>(std::istream& in, position_table& positions)
    {
      std::copy( std::istream_iterator<pos>(in), std::istream_iterator<pos>(), std::back_inserter(positions) );
      return in;
    }
    

    (Ungetestet)

    wozu?



  • wozu?

    Nun, die Devise ist doch, immer die Standard-Bibliothek ausschöpfen? Nackte Schleifen vermeiden?



  • Sone schrieb:

    wozu?

    Nun, die Devise ist doch, immer die Standard-Bibliothek ausschöpfen? Nackte Schleifen vermeiden?

    Nö, sicher nicht.

    Mach besser den Fehler weg.



  • volkard schrieb:

    Mach besser den Fehler weg.

    Der einzige Fehler den ich sehe, ist, dass der Container nicht geleert wird.
    ➡

    std::istream& operator>>(std::istream& in, position_table& positions)
    {
      positions.clear();
      pos p;
      while(in>>p)
        positions.push_back(p);
      return in;
    }
    


  • Sone schrieb:

    Der einzige Fehler den ich sehe, ist, dass der Container nicht geleert wird.

    Den meinte ich auch.



  • Auch falsch. Ein neuer Container sollte erstellt werden und dann move-assigned werden.



  • Kellerautomat schrieb:

    Auch falsch. Ein neuer Container sollte erstellt werden und dann move-assigned werden.

    Inwiefern ist das besser?



  • Kellerautomat schrieb:

    Auch falsch. Ein neuer Container sollte erstellt werden und dann move-assigned werden.

    Jo, man wird wohl erwarten, daß wenn der op>> failt, der vector unverändert bleibt.



  • Auch falsch

    Falsch! 🙂 Ansichtsache, problemspezifisch, sollte spezifiziert warden.


Anmelden zum Antworten