<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Template Vector&#x2F;List, aus Datei einlesen]]></title><description><![CDATA[<p>Leider komme ich bei folgendem Problem nicht weiter.</p>
<p>Zunächst habe ich eine Template-Methode write, die den Inhalt eines STL-Containers (vector oder list) in eine Datei schreibt.</p>
<pre><code>template&lt;class T&gt; void write(T t, std::string filename){

    std::offstream myfile(filename.c_str());
    int size = t.size();
    std::reverse(t.begin(), t.end());
    for(int i=0; i&lt; size; i++){
        myfile &lt;&lt; t.back() &lt;&lt; '\n';
        t.pop_back();
    }
    myfile.close();
}
</code></pre>
<p>Aus dieser Datei möchte ich die Daten nun wieder in einem STL-Container speichern.</p>
<p>Zunächst der Code, den ich mir bisher überlegt habe:</p>
<pre><code>template&lt;class T&gt; void read (T&amp; tm std::string filename){

    std::ifstream myfile(filename.c_str());
    std::string line;

    if(myfile.is_open(){
        whilte(myfile.good()){
            getline(myfile, line);
            t.push_back(line);
        }
    myfile.close();
    }
}
</code></pre>
<p>Das funktioniert für einen Vector mit Strings auch gut. Das ist aber nur ein Spezialfall. Sobald wir Vectoren von Floats oder so haben, geht alles über die Wupper. Ich habe mich schon verzweifelt am Casten versucht, aber auch ohne Erfolg.</p>
<p>Wir kann ich aus dem übergebenen Parameter T herauslesen, welchen Typ er hat (float, String, double ,...) und wie caste ich anschließend den String in die verschiedenen Typen?</p>
<p>Im Voraus vielen Dank für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/311040/template-vector-list-aus-datei-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 00:32:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/311040.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 25 Nov 2012 16:26:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 16:26:11 GMT]]></title><description><![CDATA[<p>Leider komme ich bei folgendem Problem nicht weiter.</p>
<p>Zunächst habe ich eine Template-Methode write, die den Inhalt eines STL-Containers (vector oder list) in eine Datei schreibt.</p>
<pre><code>template&lt;class T&gt; void write(T t, std::string filename){

    std::offstream myfile(filename.c_str());
    int size = t.size();
    std::reverse(t.begin(), t.end());
    for(int i=0; i&lt; size; i++){
        myfile &lt;&lt; t.back() &lt;&lt; '\n';
        t.pop_back();
    }
    myfile.close();
}
</code></pre>
<p>Aus dieser Datei möchte ich die Daten nun wieder in einem STL-Container speichern.</p>
<p>Zunächst der Code, den ich mir bisher überlegt habe:</p>
<pre><code>template&lt;class T&gt; void read (T&amp; tm std::string filename){

    std::ifstream myfile(filename.c_str());
    std::string line;

    if(myfile.is_open(){
        whilte(myfile.good()){
            getline(myfile, line);
            t.push_back(line);
        }
    myfile.close();
    }
}
</code></pre>
<p>Das funktioniert für einen Vector mit Strings auch gut. Das ist aber nur ein Spezialfall. Sobald wir Vectoren von Floats oder so haben, geht alles über die Wupper. Ich habe mich schon verzweifelt am Casten versucht, aber auch ohne Erfolg.</p>
<p>Wir kann ich aus dem übergebenen Parameter T herauslesen, welchen Typ er hat (float, String, double ,...) und wie caste ich anschließend den String in die verschiedenen Typen?</p>
<p>Im Voraus vielen Dank für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274534</guid><dc:creator><![CDATA[KillingEachOther]]></dc:creator><pubDate>Sun, 25 Nov 2012 16:26:11 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 16:36:50 GMT]]></title><description><![CDATA[<p>Du gehst alles falsch an.</p>
<p>Strings sind auch nur Arrays. Das heißt, du musst, wenn du alles selbst serialisieren willst, auch die Strings erstmal irgendwie serialisieren.</p>
<p>Kleiner Tipp: Um Arrays zu serialisieren musst du vorher die Größe angeben, sonst funktioniert gar nichts.</p>
<p>Bspw um Strings einzulesen und schreiben:</p>
<pre><code>template&lt;typename IterT&gt;
std::ostream&amp; write(std::ostream&amp; is, IterT first, IterT last)
{
    is &lt;&lt; std::distance(first, last);
    std::copy(first, last, std::ostream_iterator&lt;std::iterator_traits&lt;IterT&gt;::value_type&gt;(is));
    return is;
}

template&lt;typename IterT&gt;
std::istream&amp; read(std::istream&amp; is, IterT outputIter)
{
    std::size_t t = *istream_iterator&lt;std::size_t&gt;(is);
    std::copy_n(std::istream_iterator&lt;std::iterator_traits&lt;IterT&gt;::value_type&gt;(is), t, outputIter);
    return is;
}
</code></pre>
<p>(Ungetestet!)</p>
<p>Wieso nimmst du nicht einfach Boost.Serialization? Da wird alles schon gemacht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274535</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 25 Nov 2012 16:36:50 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 16:31:26 GMT]]></title><description><![CDATA[<p>Im Thread deins Kollegen steht das schon: <a href="http://www.c-plusplus.net/forum/311037" rel="nofollow">http://www.c-plusplus.net/forum/311037</a></p>
<pre><code class="language-cpp">typename T::value_type value;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2274538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274538</guid><dc:creator><![CDATA[keinkollege]]></dc:creator><pubDate>Sun, 25 Nov 2012 16:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 16:52:22 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Du gehst alles falsch an.</p>
<p>Strings sind auch nur Arrays. Das heißt, du musst, wenn du alles selbst serialisieren willst, auch die Strings erstmal irgendwie serialisieren.</p>
<p>Kleiner Tipp: Um Arrays zu serialisieren musst du vorher die Größe angeben, sonst funktioniert gar nichts.</p>
<p>Bspw um Strings einzulesen und schreiben:</p>
<pre><code>template&lt;typename IterT&gt;
std::ostream&amp; write(std::ostream&amp; is, IterT first, IterT last)
{
    is &lt;&lt; std::distance(first, last);
    std::copy(first, last, std::ostream_iterator&lt;std::iterator_traits&lt;IterT&gt;::value_type&gt;(is));
    return is;
}

template&lt;typename IterT&gt;
std::istream&amp; read(std::istream&amp; is, IterT outputIter)
{
    std::size_t t = *istream_iterator&lt;std::size_t&gt;(is);
    std::copy_n(std::istream_iterator&lt;std::iterator_traits&lt;IterT&gt;::value_type&gt;(is), t, outputIter);
    return is;
}
</code></pre>
<p>(Ungetestet!)</p>
<p>Wieso nimmst du nicht einfach Boost.Serialization? Da wird alles schon gemacht...</p>
</blockquote>
<p>Ich muss ehrlich sagen, ich komme da grad nicht mit.</p>
<p>Der Aufruf erfolgt durch (das kann ich nicht ändern):</p>
<pre><code>write(string_vec, &quot;example.dat&quot;);
</code></pre>
<p>mit</p>
<pre><code>string_vec = std::vector&lt;std::string&gt; strings;
</code></pre>
<p>(Inhalt dann noch dazu).</p>
<p>Das passt doch dann bei deinem Aufruf garnicht mehr, oder irre ich mich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274544</guid><dc:creator><![CDATA[KillingEachOther]]></dc:creator><pubDate>Sun, 25 Nov 2012 16:52:22 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 16:49:22 GMT]]></title><description><![CDATA[<p>keinkollege schrieb:</p>
<blockquote>
<p>Im Thread deins Kollegen steht das schon: <a href="http://www.c-plusplus.net/forum/311037" rel="nofollow">http://www.c-plusplus.net/forum/311037</a></p>
<pre><code class="language-cpp">typename T::value_type value;
</code></pre>
</blockquote>
<p>Wie kann ich mit diesem value, nun einen Cast durchführen:</p>
<p>Sinngemäß:</p>
<pre><code>t.push_back((value) line);
</code></pre>
<p>wäre mein Ziel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274546</guid><dc:creator><![CDATA[KillingEachOther]]></dc:creator><pubDate>Sun, 25 Nov 2012 16:49:22 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 16:53:30 GMT]]></title><description><![CDATA[<p>Lies halt mit operator&gt;&gt; anstatt mit getline ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274550</guid><dc:creator><![CDATA[keinkollege]]></dc:creator><pubDate>Sun, 25 Nov 2012 16:53:30 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 16:59:09 GMT]]></title><description><![CDATA[<p>keinkollege schrieb:</p>
<blockquote>
<p>Lies halt mit operator&gt;&gt; anstatt mit getline ein.</p>
</blockquote>
<p>Kannst du vllt kurz einen Beispielcode dazu zeigen? Was ist denn hier operator? Mit den Begriffen komme ich bezüglich c++ noch garnicht klar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<pre><code>cin &gt;&gt; variable;
</code></pre>
<p>kenne ich zum Einlesen aus der Eingabve</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274553</guid><dc:creator><![CDATA[KillingEachOther]]></dc:creator><pubDate>Sun, 25 Nov 2012 16:59:09 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 17:03:10 GMT]]></title><description><![CDATA[<pre><code>template&lt;class T&gt;
std::istream&amp; operator&gt;&gt;(std::istream &amp;is, T &amp; vec)
{
	is &gt;&gt; vec.back();

	return is;
}
</code></pre>
<p>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 <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";D"
      alt="😉"
    /></p>
<p>du müsstest halt hier reinschreiben, wie dein vector gelesen wird (egal ob aus datei oder standardeingabe oder oder oder)</p>
<p>und benutzt wird das dann so</p>
<pre><code>std::vector&lt;std::string&gt; vec;

cin &gt;&gt; vec;

//oder
std::ifstream file(&quot;lol.txt&quot;);
file &gt;&gt; vec;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2274554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274554</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 25 Nov 2012 17:03:10 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 17:09:58 GMT]]></title><description><![CDATA[<blockquote>
<p>Mit den Begriffen komme ich bezüglich c++ noch garnicht klar</p>
</blockquote>
<p>Das ist merkwürdig. Du wagst dich in Serialisierung und Templates rein, kennst aber die Stream-Operatoren noch überhaupt nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274556</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 25 Nov 2012 17:09:58 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 17:17:56 GMT]]></title><description><![CDATA[<p>Nicht ganz, Skym0sh0, ich meinte so etwas:</p>
<pre><code>template&lt;class T&gt; void read (T&amp; tm, std::string filename){

    std::ifstream myfile(filename.c_str());

    while(myfile){
        typename T::value_type value;
        if (myfile &gt;&gt; value)
          t.push_back(value);
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2274557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274557</guid><dc:creator><![CDATA[keinkollege]]></dc:creator><pubDate>Sun, 25 Nov 2012 17:17:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 17:18:59 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Mit den Begriffen komme ich bezüglich c++ noch garnicht klar</p>
</blockquote>
<p>Das ist merkwürdig. Du wagst dich in Serialisierung und Templates rein, kennst aber die Stream-Operatoren noch überhaupt nicht?</p>
</blockquote>
<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274558</guid><dc:creator><![CDATA[KillingEachOther]]></dc:creator><pubDate>Sun, 25 Nov 2012 17:18:59 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 17:25:55 GMT]]></title><description><![CDATA[<p>keinkollege schrieb:</p>
<blockquote>
<p>Nicht ganz, Skym0sh0, ich meinte so etwas:</p>
<pre><code>template&lt;class T&gt; void read (T&amp; tm, std::string filename){

    std::ifstream myfile(filename.c_str());

    while(myfile){
        typename T::value_type value;
        if (myfile &gt;&gt; value)
          t.push_back(value);
    }
}
</code></pre>
</blockquote>
<p>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.</p>
<p>Bei diesem Code im Zitat, wird allerdings nur der 1. Wert (von 3) gelesen.</p>
<p>1. was prüft while(myfile) ?<br />
2. was prüft if(myfile &gt;&gt; value) ?</p>
<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274559</guid><dc:creator><![CDATA[KillingEachOther]]></dc:creator><pubDate>Sun, 25 Nov 2012 17:25:55 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 17:47:11 GMT]]></title><description><![CDATA[<blockquote>
<p>2. was prüft if(myfile &gt;&gt; value) ?</p>
</blockquote>
<p>Ob das Extrahieren von <code>value</code> erfolgreich war.</p>
<blockquote>
<p>1. was prüft while(myfile) ?</p>
</blockquote>
<p>Ob das <code>fail</code> - oder <code>badbit</code> gesetzt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274568</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 25 Nov 2012 17:47:11 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 23:11:38 GMT]]></title><description><![CDATA[<p>keinkollege schrieb:</p>
<blockquote>
<p>Nicht ganz, Skym0sh0, ich meinte so etwas:</p>
<pre><code>template&lt;class T&gt; void read (T&amp; tm, std::string filename){

    std::ifstream myfile(filename.c_str());

    while(myfile){
        typename T::value_type value;
        if (myfile &gt;&gt; value)
          t.push_back(value);
    }
}
</code></pre>
</blockquote>
<p>Und jetzt schreiben wir das ganze auch noch in lesbar.</p>
<pre><code>template &lt;typename Container&gt;
void read_file(std::string const&amp; filename, Container&amp; c)
{
        std::ifstream is(filename);

        for(typename Container::value_type v; is &gt;&gt; v;)
                c.push_back(std::move(v));
}
</code></pre>
<p>tada.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274651</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sun, 25 Nov 2012 23:11:38 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 23:18:18 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Und jetzt schreiben wir das ganze auch noch in lesbar.</p>
</blockquote>
<p>Es ging mir darum, mich möglichst an der Vorlage vom OP zu orientieren.</p>
<p>Wenn du es mit mir aufnehmen willst, topp doch mal das hier:</p>
<pre><code class="language-cpp">template &lt;typename Container&gt;
void read_file(std::string const&amp; filename, Container&amp; c)
{
  std::copy(std::istream_iterator&lt;typename Container::value_type&gt;{std::ifstream{filename}},
            std::istream_iterator&lt;typename Container::value_type&gt;{},
            std::back_inserter&lt;typename Container::value_type&gt;(c));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2274653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274653</guid><dc:creator><![CDATA[keinkollege]]></dc:creator><pubDate>Sun, 25 Nov 2012 23:18:18 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Sun, 25 Nov 2012 23:44:15 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename Container&gt;
void read_file(std::string const &amp;filename, Container &amp;c) {
  c.insert(c.end(),
           std::istream_iterator&lt;typename Container::value_type&gt;(std::ifstream(filename.c_str())),
           std::istream_iterator&lt;typename Container::value_type&gt;());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2274659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274659</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 25 Nov 2012 23:44:15 GMT</pubDate></item><item><title><![CDATA[Reply to Template Vector&#x2F;List, aus Datei einlesen on Mon, 26 Nov 2012 07:58:29 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn du es mit mir aufnehmen wills</p>
</blockquote>
<p>Keiner wollte es hier mit dir aufnehmen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Er wollte lediglich eine elegantere Lösung zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274691</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 26 Nov 2012 07:58:29 GMT</pubDate></item></channel></rss>