Template Vector/List, aus Datei einlesen



  • keinkollege schrieb:

    Lies halt mit operator>> anstatt mit getline ein.

    Kannst du vllt kurz einen Beispielcode dazu zeigen? Was ist denn hier operator? Mit den Begriffen komme ich bezüglich c++ noch garnicht klar 😞

    cin >> variable;
    

    kenne ich zum Einlesen aus der Eingabve



  • template<class T>
    std::istream& operator>>(std::istream &is, T & vec)
    {
    	is >> vec.back();
    
    	return is;
    }
    

    sowas in der art meint er. aber ich kann da grad kein gutes beispiel für geben, hab den thread nicht aufmerksam mitverfolgt und auch nicht wirklich zeit dafür 😉

    du müsstest halt hier reinschreiben, wie dein vector gelesen wird (egal ob aus datei oder standardeingabe oder oder oder)

    und benutzt wird das dann so

    std::vector<std::string> vec;
    
    cin >> vec;
    
    //oder
    std::ifstream file("lol.txt");
    file >> vec;
    


  • Mit den Begriffen komme ich bezüglich c++ noch garnicht klar

    Das ist merkwürdig. Du wagst dich in Serialisierung und Templates rein, kennst aber die Stream-Operatoren noch überhaupt nicht?



  • Nicht ganz, Skym0sh0, ich meinte so etwas:

    template<class T> void read (T& tm, std::string filename){
    
        std::ifstream myfile(filename.c_str());
    
        while(myfile){
            typename T::value_type value;
            if (myfile >> value)
              t.push_back(value);
        }
    }
    


  • Sone schrieb:

    Mit den Begriffen komme ich bezüglich c++ noch garnicht klar

    Das ist merkwürdig. Du wagst dich in Serialisierung und Templates rein, kennst aber die Stream-Operatoren noch überhaupt nicht?

    Da hast du schon recht. Ich bin mit der Situation auch alles andere als glücklich. Zum Lösen des Problems, muss ich aber scheinbar so vorgehen.



  • keinkollege schrieb:

    Nicht ganz, Skym0sh0, ich meinte so etwas:

    template<class T> void read (T& tm, std::string filename){
    
        std::ifstream myfile(filename.c_str());
    
        while(myfile){
            typename T::value_type value;
            if (myfile >> value)
              t.push_back(value);
        }
    }
    

    Zu diesem Code habe ich ein paar Fragen. Eben habe ich die Idee von Skym0sh0 (bzw. deine) in mein Programm übernommen. Die Werte werden nun übernommen. Nur der letzte Wert wurde doppelt gelesen.

    Bei diesem Code im Zitat, wird allerdings nur der 1. Wert (von 3) gelesen.

    1. was prüft while(myfile) ?
    2. was prüft if(myfile >> value) ?

    Sorry, wenn das alles etwas arg tapsig ist, aber ich muss mich gerade erst in C++ einlesen. Das Tempo ist dabei leider ungemütlich hoch.



  • 2. was prüft if(myfile >> value) ?

    Ob das Extrahieren von value erfolgreich war.

    1. was prüft while(myfile) ?

    Ob das fail - oder badbit gesetzt wurde.



  • keinkollege schrieb:

    Nicht ganz, Skym0sh0, ich meinte so etwas:

    template<class T> void read (T& tm, std::string filename){
    
        std::ifstream myfile(filename.c_str());
    
        while(myfile){
            typename T::value_type value;
            if (myfile >> value)
              t.push_back(value);
        }
    }
    

    Und jetzt schreiben wir das ganze auch noch in lesbar.

    template <typename Container>
    void read_file(std::string const& filename, Container& c)
    {
            std::ifstream is(filename);
    
            for(typename Container::value_type v; is >> v;)
                    c.push_back(std::move(v));
    }
    

    tada.



  • Kellerautomat schrieb:

    Und jetzt schreiben wir das ganze auch noch in lesbar.

    Es ging mir darum, mich möglichst an der Vorlage vom OP zu orientieren.

    Wenn du es mit mir aufnehmen willst, topp doch mal das hier:

    template <typename Container>
    void read_file(std::string const& filename, Container& c)
    {
      std::copy(std::istream_iterator<typename Container::value_type>{std::ifstream{filename}},
                std::istream_iterator<typename Container::value_type>{},
                std::back_inserter<typename Container::value_type>(c));
    }
    


  • template<typename Container>
    void read_file(std::string const &filename, Container &c) {
      c.insert(c.end(),
               std::istream_iterator<typename Container::value_type>(std::ifstream(filename.c_str())),
               std::istream_iterator<typename Container::value_type>());
    }
    


  • Wenn du es mit mir aufnehmen wills

    Keiner wollte es hier mit dir aufnehmen. 🙂
    Er wollte lediglich eine elegantere Lösung zeigen.


Anmelden zum Antworten