<?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[Einlesen von daten file]]></title><description><![CDATA[<p>Hallo Community,</p>
<p>ich möchte gerne ein .txt file einlesen, welcher aus 30000 Zeilen mit jeweils 16 Gleitkommazahlen besteht, die jeweils mit ; getrennt sind. Dazu habe ich das untere Programm.</p>
<p>Allerdings möchte ich erst ab Zeile 2 einlesen, da in der ersten Zeile die Bezeichnungen der Spalten stehen. Zusätzlich möchte ich erst ab den jeweils zweiten Einträgen einer jeden Zeile mit dem einlesen starten und ebenfalls die letzte Zahl in jeder Zeile ignorieren. Jetzt stehe ich etwas auf dem Schlauch und hoffe, dass ihr mir da weiter helfen könnt. Danke schon einmal für Eure Hilfe</p>
<pre><code>#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;iterator&gt;
using namespace std;

using record_t = vector &lt;double&gt;;
using data_t = vector &lt;record_t&gt; ;

//-----------------------------------------------------------------------------
// Let's overload the stream input operator to read a list of CSV fields (which a CSV record).
// Remember, a record is a list of doubles separated by commas ','.
istream&amp; operator &gt;&gt; (istream&amp; ins, record_t&amp; record)
{
	// make sure that the returned record contains only the stuff we read now
	record.clear();

	// read the entire line into a string (a CSV record is terminated by a newline)
	string line;
	getline(ins, line);

	// now we'll use a stringstream to separate the fields out of the line
	stringstream ss(line);
	string field;
	while (getline(ss, field, ';'))
	{
		// for each field we wish to convert it to a double
		// (since we require that the CSV contains nothing but floating-point values)
		stringstream fs(field);
		double f = 0.0;  // (default value is 0.0)
		fs &gt;&gt; f;

		// add the newly-converted field to the end of the record
		record.push_back(f);
	}

	// Now we have read a single line, converted into a list of fields, converted the fields
	// from strings to doubles, and stored the results in the argument record, so
	// we just return the argument stream as required for this kind of input overload function.
	return ins;
}

//-----------------------------------------------------------------------------
// Let's likewise overload the stream input operator to read a list of CSV records.
// This time it is a little easier, just because we only need to worry about reading
// records, and not fields.
istream&amp; operator &gt;&gt; (istream&amp; ins, data_t&amp; data)
{
	// make sure that the returned data only contains the CSV data we read here
	data.clear();

	// For every record we can read from the file, append it to our resulting data
	record_t record;
	while (ins &gt;&gt; record)
	{
		data.push_back(record);
	}

	// Again, return the argument stream as required for this kind of input stream overload.
	return ins;
}

//-----------------------------------------------------------------------------
// Now to put it all to use.
int main()
{
	// Here is the data we want.
	data_t data;

	// Here is the file containing the data. Read it into data.
	ifstream infile(&quot;test.txt&quot;);
	infile &gt;&gt; data;

	// Complain if something went wrong.
	if (!infile.eof())
	{
		cout &lt;&lt; &quot;Fooey!\n&quot;;
		return 1;
	}

	infile.close();

	// Otherwise, list some basic information about the file.
	cout &lt;&lt; &quot;Your CSV file contains &quot; &lt;&lt; data.size() &lt;&lt; &quot; records.\n&quot;;

	unsigned max_record_size = 0;
	for (unsigned n = 0; n &lt; data.size(); n++)
		if (max_record_size &lt; data[n].size())
			max_record_size = data[n].size();
	cout &lt;&lt; &quot;The largest record has &quot; &lt;&lt; max_record_size &lt;&lt; &quot; fields.\n&quot;;

	cout &lt;&lt; &quot;The second field in the fourth record contains the value &quot; &lt;&lt; data[0][0] &lt;&lt; &quot;.\n&quot;;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/338787/einlesen-von-daten-file</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 03:17:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/338787.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Jul 2016 11:48:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einlesen von daten file on Mon, 11 Jul 2016 11:48:45 GMT]]></title><description><![CDATA[<p>Hallo Community,</p>
<p>ich möchte gerne ein .txt file einlesen, welcher aus 30000 Zeilen mit jeweils 16 Gleitkommazahlen besteht, die jeweils mit ; getrennt sind. Dazu habe ich das untere Programm.</p>
<p>Allerdings möchte ich erst ab Zeile 2 einlesen, da in der ersten Zeile die Bezeichnungen der Spalten stehen. Zusätzlich möchte ich erst ab den jeweils zweiten Einträgen einer jeden Zeile mit dem einlesen starten und ebenfalls die letzte Zahl in jeder Zeile ignorieren. Jetzt stehe ich etwas auf dem Schlauch und hoffe, dass ihr mir da weiter helfen könnt. Danke schon einmal für Eure Hilfe</p>
<pre><code>#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;iterator&gt;
using namespace std;

using record_t = vector &lt;double&gt;;
using data_t = vector &lt;record_t&gt; ;

//-----------------------------------------------------------------------------
// Let's overload the stream input operator to read a list of CSV fields (which a CSV record).
// Remember, a record is a list of doubles separated by commas ','.
istream&amp; operator &gt;&gt; (istream&amp; ins, record_t&amp; record)
{
	// make sure that the returned record contains only the stuff we read now
	record.clear();

	// read the entire line into a string (a CSV record is terminated by a newline)
	string line;
	getline(ins, line);

	// now we'll use a stringstream to separate the fields out of the line
	stringstream ss(line);
	string field;
	while (getline(ss, field, ';'))
	{
		// for each field we wish to convert it to a double
		// (since we require that the CSV contains nothing but floating-point values)
		stringstream fs(field);
		double f = 0.0;  // (default value is 0.0)
		fs &gt;&gt; f;

		// add the newly-converted field to the end of the record
		record.push_back(f);
	}

	// Now we have read a single line, converted into a list of fields, converted the fields
	// from strings to doubles, and stored the results in the argument record, so
	// we just return the argument stream as required for this kind of input overload function.
	return ins;
}

//-----------------------------------------------------------------------------
// Let's likewise overload the stream input operator to read a list of CSV records.
// This time it is a little easier, just because we only need to worry about reading
// records, and not fields.
istream&amp; operator &gt;&gt; (istream&amp; ins, data_t&amp; data)
{
	// make sure that the returned data only contains the CSV data we read here
	data.clear();

	// For every record we can read from the file, append it to our resulting data
	record_t record;
	while (ins &gt;&gt; record)
	{
		data.push_back(record);
	}

	// Again, return the argument stream as required for this kind of input stream overload.
	return ins;
}

//-----------------------------------------------------------------------------
// Now to put it all to use.
int main()
{
	// Here is the data we want.
	data_t data;

	// Here is the file containing the data. Read it into data.
	ifstream infile(&quot;test.txt&quot;);
	infile &gt;&gt; data;

	// Complain if something went wrong.
	if (!infile.eof())
	{
		cout &lt;&lt; &quot;Fooey!\n&quot;;
		return 1;
	}

	infile.close();

	// Otherwise, list some basic information about the file.
	cout &lt;&lt; &quot;Your CSV file contains &quot; &lt;&lt; data.size() &lt;&lt; &quot; records.\n&quot;;

	unsigned max_record_size = 0;
	for (unsigned n = 0; n &lt; data.size(); n++)
		if (max_record_size &lt; data[n].size())
			max_record_size = data[n].size();
	cout &lt;&lt; &quot;The largest record has &quot; &lt;&lt; max_record_size &lt;&lt; &quot; fields.\n&quot;;

	cout &lt;&lt; &quot;The second field in the fourth record contains the value &quot; &lt;&lt; data[0][0] &lt;&lt; &quot;.\n&quot;;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2501837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2501837</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Mon, 11 Jul 2016 11:48:45 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Mon, 11 Jul 2016 13:03:36 GMT]]></title><description><![CDATA[<p>hallo,<br />
was du suchst ist basic_istream::ignore(len, delim) - das ignoriert dir maximal &quot;len&quot; zeichen, aber höchstens bis zum zeichen &quot;delim&quot;.</p>
<p>für das ignorieren des letzten werts: einfach nicht in den vector einfügen.</p>
<pre><code class="language-cpp">istream&amp; operator &gt;&gt; (istream&amp; ins, data_t&amp; data)
{
    data.clear();

    //ignoriere die nächsten zeichen bis zum '\n'    
    ins.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
    record_t record;
    while (ins &gt;&gt; record)
    {
        data.push_back(record);
    }
    return ins;
}

istream&amp; operator &gt;&gt; (istream&amp; ins, record_t&amp; record)
{
    record.clear();

    string line;
    getline(ins, line);

    istringstream ss(line); //istringstream reicht
    //ignoriere den ersten wert (bis zum ersten ';')
    ss.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), ';');

    while (ss) {
        double f = 0.0; char tmp;
        ss &gt;&gt; f &gt;&gt; tmp;
        if (ss) record.push_back(f); //ignoriert den letzten wert
    }
    return ins;
}
</code></pre>
<p>eventuell kannst du dir das aber alles ersparen und findest einen fertigen, konfigurierbaren und performanten csv-reader?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2501855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2501855</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Mon, 11 Jul 2016 13:03:36 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Mon, 11 Jul 2016 13:04:46 GMT]]></title><description><![CDATA[<p>statt basic_istream::ignore ist es auch durchaus üblich (aber imo nicht so schön explizit), getline zu verwenden und den wert einfach zu verwerfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2501857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2501857</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Mon, 11 Jul 2016 13:04:46 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Mon, 11 Jul 2016 13:33:26 GMT]]></title><description><![CDATA[<p>Dankeschön für deine Hilfe <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="🙂"
    /></p>
<p>Mit verwerfen habe ich mir auch schon überlegt, beispielsweise mit .erase oder?</p>
<p>wo finde ich denn so einen schlanken und schnellen csv reader? Im netz wird man ja mit Optionen diesbzüglich erschlagen.</p>
<p>Noch eine Frage: ist vector eine gute Option zum Speichern solcher Datenfiles?<br />
Insbesondere, wenn ich am Anfang und am Ende jedes Untervektors Elemente entfernen bzw. modifizieren möchte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2501859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2501859</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Mon, 11 Jul 2016 13:33:26 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Mon, 11 Jul 2016 14:25:44 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mit verwerfen (einer zeile) meinte ich</p>
<pre><code class="language-cpp">string ignore;
getline(istream, ignore);
</code></pre>
<p>zum löschen einzelner elementen aus einem vector gibt es zwar pop_back, allerdings kein pop_front (weil das sehr ineffizient wäre; pop_back ist kein performance-problem)</p>
<p>vector ist im prinzip nichts anderes als ein verwaltetes und einfach zu bedienendes dynamisches array. wenn du nicht viele elemente hinten einfügst oder wie wild elemente aus der mitte/vom beginn des vector löschst und du erst zur laufzeit weißt, für wieviele elemente du platz brauchst, ist vector schon die richtige wahl. wenn du allerdings genau weißt, wieviele elemente du (jemals) einlesen wirst, dann ist ein array mit fixer größe am stack sicherlich schneller. wenn du viele insert/delete operationen hast, dann vmtl. std::list oder auch std::deque. je nachdem, was du brauchst... dafür ist vector sehr schnell im random access (im vgl. zur list). am besten ist es, die werte, die du nicht brauchst, erst gar nicht in den vector zu kopieren.</p>
<p>fertige CSV-libraries kenne ich nicht/habe ich (in C++) noch nie benötigt, aber ich würde da wohl zuerstmal schauen, ob boost so etwas in der art hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2501872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2501872</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Mon, 11 Jul 2016 14:25:44 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Mon, 11 Jul 2016 15:31:01 GMT]]></title><description><![CDATA[<p>Vielen Dank dove für deine nützliche und ausführliche Hilfe!</p>
<p>Die Daten die ich hier einlese, muss ich im weiteren Verlauf nur auslesen bzw. in Algorithmen verwenden. An den Werten im Container ändere ich also nichts.</p>
<p>Soll ich dann also lieber std::array&lt;double&gt; verwenden?</p>
<p>Da muss ich ja bei der Deklaration schon die Größe festlegen, die aber ja erst beim Einlesen des Files bekannt wird, oder?</p>
<p>Wie funktioniert denn genau</p>
<pre><code>while (ss) { 
        double f = 0.0; char tmp; 
        ss &gt;&gt; f &gt;&gt; tmp; 
        if (ss) record.push_back(f); //ignoriert den letzten wert 
    }
</code></pre>
<p>der stream ss beinhaltet eine Zeile mit simikolons und die while wird solange ausgeführt, bis der stream am Ende der Zeile angekommen ist. Dann wird jeweils die Zahl; in float geschoben und das rechtsstehende ; weiter in tmp, richtig?</p>
<p>aber wann gibt dann die if(ss) true aus? und wo und wie wird die letzte Ziffer der Zeilen fallengelassen?</p>
<p>Kannst du mir das bitte erklären?</p>
<p>Danke schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2501874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2501874</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Mon, 11 Jul 2016 15:31:01 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Mon, 11 Jul 2016 17:09:57 GMT]]></title><description><![CDATA[<p>klar.</p>
<p>das funktioniert so: ein istream (egal, ob ifstream, istringstream, ...) hat intern ein paar flags, die seinen aktuellen zustand wiedergeben: eof, fail, bad, und good - die kann man mit den gleichnamigen funktionen auch explizit abfragen. gleichzeitig überlädt der istream operator! und operator bool - so dass man ihn einfach in abfragen verwenden kann (wie du es ja selbst auch machst)</p>
<p>operator bool() liefert einfach zurück: !istream::fail()</p>
<pre><code class="language-cpp">while (in &gt;&gt; var)
//heißt soviel wie
while (operator&gt;&gt;(in, var).operator bool())
//heißt soviel wie
while (!operator&gt;&gt;(in, var).fail())
</code></pre>
<p>fail() liefert dann true, wenn das interne failbit oder das interne badbit (die unterscheidung muss dich jetzt nicht unbedingt interessieren) gesetzt sind; das passiert u.a. dann, wenn ein einleseversuch nicht funktioniert hat, etwa weil das ende des streams erreicht wurde. in diesem fall wird zusätzlich noch das eofbit gesetzt.</p>
<pre><code class="language-cpp">while (!operator&gt;&gt;(in, var).fail())
//heißt so viel wie
while (true) {
  string var;
  in &gt;&gt; var; //kann funktionieren, muss aber nicht - diverse gründe
  if (in.bad() || in.fail()) break;
  //...
}
//jetzt kann (sollte) man noch testen:
if (in.fail() &amp;&amp; in.eof()) //alles ok: einlesen in var hat nicht funktioniert, weil der stream ans ende gelangt ist.
</code></pre>
<p>der code von oben:</p>
<pre><code class="language-cpp">while (!ss.fail()) { 
        double f = 0.0; char tmp; 
        ss &gt;&gt; f &gt;&gt; tmp; //das funktioniert nur, wenn *nach* dem double noch ein char (das ';') kommt. beim letzten wert ist in einer csv-datei *nicht* mehr der fall.
        //der stream kann also den wert nicht einlesen und setzt das failbit - und das eofbit, weil es das ende der zeile war.

        if (!ss.fail()) record.push_back(f); //ignoriert den letzten wert,
        //nur, wenn ss&gt;&gt;f&gt;&gt;tmp funktioniert hat, wird dem vector der wert eingefügt. 
        //ss&gt;&gt;f&gt;&gt;tmp *kann* für den letzten wert nicht funktionieren, da kein char (kein tmp) mehr da ist.

       //alternativ:
       if (!ss.eof()) record.push_back(f);
       //das macht das vielleicht expliziter, dass der letzte wert ignoriert wird.
    }
</code></pre>
<p>(falls es immer noch nicht klar ist, einfach weiter fragen)</p>
<p>nummer 2:<br />
da du die größe des arrays erst beim einlesen kennst, musst du ein dynamisches array verwenden. ein std::array könntest du nur dann verwenden, wenn du schon vor dem einlesen - beim kompilieren - weißt, wie groß die datei (immer) sein wird.</p>
<p>wenn die werte im container immer so bleiben, ist ein vector wahrscheinlich genau das richtige. einmal erzeugt sollte er allerdings nicht mehr weiter verändert werden - achte also einfach darauf, dass du deine vektoren nicht unnötig kopierst [nebenbei: C++ wird irgendwann in zukunft eine klasse namens std::array_view dafür anbieten und die C++ Core Guideline Support Library kennt dafür (und mehr) die klasse span&lt;&gt;] - der code sieht ansonsten recht gut aus. (bisschen viele kommentare für meinen geschmack).</p>
<p>im übrigen kann ich all diese definitionen auch nicht auswendig, sondern weiß, wo ich nachsehen muss: <a href="http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool" rel="nofollow">http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2501889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2501889</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Mon, 11 Jul 2016 17:09:57 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Mon, 11 Jul 2016 17:17:09 GMT]]></title><description><![CDATA[<p>Ich bin dir sehr dankbar, was für eine ausführliche und hilfreiche Erklärung.</p>
<p>Tausend Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2501890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2501890</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Mon, 11 Jul 2016 17:17:09 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Tue, 12 Jul 2016 08:38:40 GMT]]></title><description><![CDATA[<p>Ich darf nochmal kurz nachfragen:</p>
<p>Durch dein spezifisches Stream Layout</p>
<pre><code>ss &gt;&gt; f &gt;&gt; tmp;
</code></pre>
<p>legst du also fest, das ein Feld aus einer Gleitkomma Zahl gefolgt von einem Char zu bestehen hat. Bei der letzten Zahl ist das nicht mehr der Fall, weshalb auch die Zahl an sich verworfen wird?</p>
<p>Weiterhin wird durch die Codezeile festgelegt, dass immer nur ein Feld pro while-Schleifen Aufruf bearbeitet wird, oder?</p>
<p>Wozu dient denn die if(ss) Abfrage dann noch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2501948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2501948</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Tue, 12 Jul 2016 08:38:40 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Tue, 12 Jul 2016 08:48:31 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">s &gt;&gt; f &gt;&gt; tmp;
</code></pre>
<p>ist exakt gleichbedeutend mit:</p>
<pre><code class="language-cpp">s &gt;&gt; f;
s &gt;&gt; tmp;
</code></pre>
<p>das heißt, die letzte zahl wird jedenfalls auch in f eingelesen und nicht automatisch verworfen. erst das s&gt;&gt;tmp schlägt fehl. daher die überprüfung. ohne die überprüfung if (ss) würde also das zuletzt eingelesene f auch noch in den vector eingefügt werden.</p>
<p>kürzer wäre vielleicht</p>
<pre><code class="language-cpp">if (s &gt;&gt; f &gt;&gt; tmp) vector.push_back(f);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2501951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2501951</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Tue, 12 Jul 2016 08:48:31 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Tue, 12 Jul 2016 09:06:25 GMT]]></title><description><![CDATA[<p>Hab vielen Dank dove</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2501953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2501953</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Tue, 12 Jul 2016 09:06:25 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Tue, 12 Jul 2016 13:09:10 GMT]]></title><description><![CDATA[<p>Wenn ich jetzt aber diese jeweils letzte Ziffer jeder Zeile in einen eigenen Vector der Länge 30000 abspeichern wolle, muss ich das auch in den operator Überladungs Funktionen machen geschickterweise oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502020</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Tue, 12 Jul 2016 13:09:10 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Tue, 12 Jul 2016 13:21:51 GMT]]></title><description><![CDATA[<p>geschickter weise willst du die datei bzw. jede einzelnen zeile nur einmal einlesen/verarbeiten, ja.</p>
<p>die beste lösung dafür, wäre wohl statt</p>
<pre><code class="language-cpp">using record_t = vector&lt;double&gt;;
</code></pre>
<p>eine eigene klasse zu verwenden:</p>
<pre><code class="language-cpp">struct record_t {
  vector&lt;double&gt; values;
  double first; //willst du vielleicht auch
  double last;
};
</code></pre>
<p>aber wie genau dieser selbstdefinierte typ aussehen sollte, hängt natürlich am meisten davon ab, was genau du damit weiter tun willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502031</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Tue, 12 Jul 2016 13:21:51 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Tue, 12 Jul 2016 13:30:47 GMT]]></title><description><![CDATA[<p>Also die erste Zahl in jeder Zeile ist tatsächlich nur nen Zeilenindex und da später die Zeilen sowieso randomisiert werden, kann ich die verfallen lassen.<br />
Alle weiteren Zahlen in den 30k Zeilen will ich wie bereits geschehen in nem 2 dimensionalen vector abspeichern. Nur zusätzlich möchte ich jetzt noch die letzten Zahlen einer jeden Zeile in einer Art Spaltenvektor abspeichern</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502034</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Tue, 12 Jul 2016 13:30:47 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Thu, 14 Jul 2016 09:50:36 GMT]]></title><description><![CDATA[<p>Hab es jetzt folgendermaßen gelöst, gibt es von Eurer Seite aus Verbesserungsvorschläge?</p>
<pre><code>#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;

using record = vector &lt;float&gt;;

struct recordStruct {
	record rec;
	int lbl;
};

struct dataStruct {
	vector &lt;record&gt; dsgnMat;
	vector&lt;int&gt; labels;
};
//-----------------------------------------------------------------------------
// Let's overload the stream input operator to read a list of CSV fields (which a CSV record).
// Remember, a record is a list of doubles separated by commas ';'.
istream&amp; operator &gt;&gt; (istream&amp; ins, recordStruct&amp; recordLine)
{
	recordLine.rec.clear();
	string line;
	getline(ins, line);
	istringstream ss(line);

	//ignoriere den ersten wert (bis zum ersten ';') 
	ss.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), ';');

	while (ss) {
		float f{ 0.f };
		char tmp;
		if (ss &gt;&gt; f &gt;&gt; tmp) 
			recordLine.rec.push_back(f); //ignoriert den letzten wert 
		else 
			if (f == 1) 
				recordLine.lbl = 1;
			else if (f == 2)
				recordLine.lbl = -1;
	}
	return ins;
}

//-----------------------------------------------------------------------------
// Let's likewise overload the stream input operator to read a list of CSV records.
// This time it is a little easier, just because we only need to worry about reading
// records, and not fields.
istream&amp; operator &gt;&gt; (istream&amp; ins, dataStruct&amp; data)
{
	// make sure that the returned data only contains the CSV data we read here
	// clear once
	data.dsgnMat.clear();
	data.labels.clear();
	ins.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
	// For every record we can read from the file, append it to our resulting data
	recordStruct recordLine;
	while (ins &gt;&gt; recordLine)
	{
		data.dsgnMat.push_back(recordLine.rec);
		data.labels.push_back(recordLine.lbl);
	}

	// Again, return the argument stream as required for this kind of input stream overload.
	return ins;
}

//-----------------------------------------------------------------------------
// Now to put it all to use.
int main()
{
	// Here is the data we want.
	dataStruct data;

	// Here is the file containing the data. Read it into data.
	ifstream infile(&quot;RadarDataset.txt&quot;);
	infile &gt;&gt; data;

	// Complain if something went wrong.
	if (!infile.eof())
	{
		cout &lt;&lt; &quot;Could not find data file!\n&quot;;
		return 1;
	}

	infile.close();

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2502314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502314</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Thu, 14 Jul 2016 09:50:36 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Thu, 14 Jul 2016 18:32:54 GMT]]></title><description><![CDATA[<p>hallo,</p>
<p>ja, ich würde den operator&gt;&gt; für die einzelne zeile unter diesen umständen als eigene funktion implementieren. die ist außerdem ja eh nur dazu da, eine einzelne zeile einzulesen und sollte am ende nicht öffentlich sichtbar sein.</p>
<p>du verschwendest ja ein bisschen speicherplatz in dem du zwischen record und recordStruct unterscheidest. das ist aber gar nicht nötig.</p>
<pre><code class="language-cpp">using record_t = vector &lt;float&gt;; 
using label_t = int; //der symmetrie wegen

struct dataStruct { 
    vector &lt;record_t&gt; dsgnMat; 
    vector&lt;label_t&gt; labels; 
}; 

std::pair&lt;record_t, label_t&gt; read_record(istream&amp; ins) //statt operator&gt;&gt;
//std::pair, weil die funktion zwei rückgabewerte hat - einen record und ein label
{ 
    string line; 
    getline(ins, line); 
    istringstream ss(line); 

    //ignoriere den ersten wert (bis zum ersten ';') 
    ss.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), ';'); 

    record_t recordLine;

    while (ss) { 
        float f{ 0.f }; 
        char tmp; 
        if (ss &gt;&gt; f &gt;&gt; tmp) 
            recordLine.push_back(f); //ignoriert den letzten wert 
        else {
            if (f == 1) 
                return std::make_pair(std::move(recordLine), 1);
            else if (f == 2) 
                return std::make_pair(std::move(recordLine), -1);
        }
    } 

    throw std::runtime_error{&quot;wrong format&quot;}; //evtl auftretende fehler
   //könntest du noch berücksichtigen. mit rückabwicklung und so, ist eine 
   //gute denkaufgabe.
} 

istream&amp; operator &gt;&gt; (istream&amp; ins, dataStruct&amp; data) 
{ 
    // make sure that the returned data only contains the CSV data we read here 
    // clear once 
    data.dsgnMat.clear(); 
    data.labels.clear(); 

    ins.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n'); 
    // For every record we can read from the file, append it to our resulting data 
    record_t recordLine; 
    label_t label;

    for (std::tie(recordLine,label) = read_record(ins); ins;
         std::tie(recordLine, label) = read_record(ins))
    { 
        data.dsgnMat.push_back(std::move(recordLine)); 
        data.labels.push_back(label); 
    } 

    // Again, return the argument stream as required for this kind of input stream overload. 
    return ins; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2502379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502379</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Thu, 14 Jul 2016 18:32:54 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Fri, 15 Jul 2016 08:52:20 GMT]]></title><description><![CDATA[<p>Danke vielmals. Wozu dienen move und tie an der Stelle?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502431</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Fri, 15 Jul 2016 08:52:20 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Fri, 15 Jul 2016 09:00:58 GMT]]></title><description><![CDATA[<p>wenn eine funktion mit mehreren rückgabewerten (std::pair, std::tuple) arbeitet, dann kann man mit std::tie die einzelnen rückgabewerte in einzelne variablen packen.</p>
<p>ohne tie:</p>
<pre><code class="language-cpp">pair&lt;int, int&gt; some_function () {
  return make_pair(1, 2);
}

//...

pair&lt;int, int&gt; result = some_function();
cout &lt;&lt; result.first &lt;&lt; &quot;, &quot; &lt;&lt; result.second; //nicht schön.
</code></pre>
<p>mit tie:</p>
<pre><code class="language-cpp">pair&lt;int, int&gt; some_function () {
  return make_pair(1, 2);
}

int result, status;
tie(result, status) = some_function();
cout &lt;&lt; result &lt;&lt; &quot;, &quot; &lt;&lt; status;
</code></pre>
<p>(mit C++17 wird das noch üblicher werden)</p>
<p>move dient dazu, zu verhindern, dass eine kopie angelegt wird. mit move sage ich dem compiler: &quot;mach keine kopie, sondern stiehl dem vector den inhalt, ich verspreche dir, ich rühre den original-vector nicht mehr an&quot; - das was nach einem move von der variable übrig bleibt, ist sozusagen nur mehr eine &quot;leere hülle&quot;.</p>
<p>bei push_back ebenso, weil dort auch sonst eine kopie des originaldatensatzes erstellt würde, obwohl du ja gar keine kopie brauchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502434</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Fri, 15 Jul 2016 09:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Fri, 15 Jul 2016 09:36:03 GMT]]></title><description><![CDATA[<p>Danke, ich habe durch diesen Thread schon unwahrscheinlich viel gelernt <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="🙂"
    /></p>
<p>Mh habe deinen Code statt meinem jetzt in mein Projekt eingebunden und jetzt crasht es beim ausführen &quot;Abort() has been called&quot;</p>
<pre><code>#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;tuple&gt; //std::pair
#include &lt;utility&gt; //std::tuple
using namespace std;

using record_t = vector &lt;float&gt;;
using label_t = int; //der symmetrie wegen 

struct dataStruct {
	vector &lt;record_t&gt; dsgnMat;
	vector&lt;label_t&gt; labels;
};

std::pair&lt;record_t, label_t&gt; read_record(istream&amp; ins) //statt operator&gt;&gt; 
													   //std::pair, weil die funktion zwei rückgabewerte hat - einen record und ein label 
{
	string line;
	getline(ins, line);
	istringstream ss(line);

	//ignoriere den ersten wert (bis zum ersten ';') 
	ss.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), ';');

	record_t recordLine;

	while (ss) {
		float f{ 0.f };
		char tmp;
		if (ss &gt;&gt; f &gt;&gt; tmp)
			recordLine.push_back(f); //ignoriert den letzten wert 
		else {
			if (f == 1)
				return std::make_pair(std::move(recordLine), 1);
			else if (f == 2)
				return std::make_pair(std::move(recordLine), -1);
		}
	}

	throw std::runtime_error{ &quot;wrong format&quot; }; //evtl auftretende fehler 
												//könntest du noch berücksichtigen. mit rückabwicklung und so, ist eine 
												//gute denkaufgabe. 
}

istream&amp; operator &gt;&gt; (istream&amp; ins, dataStruct&amp; data)
{
	// make sure that the returned data only contains the CSV data we read here 
	// clear once 
	data.dsgnMat.clear();
	data.labels.clear();

	ins.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
	// For every record we can read from the file, append it to our resulting data 
	record_t recordLine;
	label_t label;

	for (std::tie(recordLine, label) = read_record(ins); ins;
		std::tie(recordLine, label) = read_record(ins))
	{
		data.dsgnMat.push_back(std::move(recordLine));
		data.labels.push_back(label);
	}

	// Again, return the argument stream as required for this kind of input stream overload. 
	return ins;
}

//-----------------------------------------------------------------------------
// Now to put it all to use.
int main()
{
	// Here is the data we want.
	dataStruct data;

	// Here is the file containing the data. Read it into data.
	ifstream infile(&quot;test.txt&quot;);
	infile &gt;&gt; data;

	// Complain if something went wrong.
	if (!infile.eof())
	{
		cout &lt;&lt; &quot;Could not find data file!\n&quot;;
		return 1;
	}

	infile.close();

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2502435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502435</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Fri, 15 Jul 2016 09:36:03 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Fri, 15 Jul 2016 16:33:29 GMT]]></title><description><![CDATA[<p>sorry, war mein fehler - die funktion wirft die exception (die ich selbst ohne nachzudenken eingefügt hab), weil eine zeile zu viel eingelesen wird.</p>
<p>das liegt am ende daran, dass das eofbit zwar gesetzt ist, aber das keine auswirkung auf &quot;fail()&quot; hat und damit auf die bedingung in der schleife. musste ich jetzt selbst erst testen. die lösung besteht darin, die schleife so zu formulieren:</p>
<pre><code class="language-cpp">do {
  std::tie(recordLine, label) = read_record(ins); 
  data.dsgnMat.push_back(std::move(recordLine)); 
  data.labels.push_back(label); 
} while (!ins.eof());
</code></pre>
<p>immer mit der dokumentation der funktionen arbeiten; bei solchen fehlern den debugger oder eigene debug-funktionen schreiben. dann kommt man schnell drauf, was los ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502480</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Fri, 15 Jul 2016 16:33:29 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Fri, 15 Jul 2016 16:57:58 GMT]]></title><description><![CDATA[<p>Also bei mir besteht das Problem weiterhin und beim Ausführen stürzt es ab</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502481</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Fri, 15 Jul 2016 16:57:58 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Fri, 15 Jul 2016 18:47:26 GMT]]></title><description><![CDATA[<p>mm? bei mir auch. jetzt.<br />
liegt wohl daran, dass ich hier bei mir zum testen eine etwas andere version hatte und nicht aufgepasst, was ich wo noch geändert hatte...</p>
<p>hab jetzt den code etwas aufgeräumt und umstrukturiert:</p>
<pre><code class="language-cpp">using record_t = vector &lt;float&gt;; 
using label_t = int;

struct dataStruct { 
    vector &lt;record_t&gt; dsgnMat; 
    vector&lt;label_t&gt; labels; 
}; 

std::pair&lt;record_t, label_t&gt; record_from(string const&amp; line) 
//hier jetzt ohne den ursprünglichen stream zu übergeben.
//zuviele streams machen mir den kopf ganz wirr.
{  
    istringstream ss(line); 

    //ignoriere den ersten wert (bis zum ersten ';') 
    ss.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), ';'); 
    record_t recordLine; 

    float f{ 0.f }; 
    char tmp; 
    while (ss &gt;&gt; f &gt;&gt; tmp) {  
        recordLine.push_back(f); //ignoriert den letzten wert 
    }

    if (f == 1) {
        return std::make_pair(std::move(recordLine), 1); 
    } else if (f == 2) {
        return std::make_pair(std::move(recordLine), -1); 
    }

    throw std::invalid_argument{&quot;wrong line format given to record_from&quot; }; 
} 

istream&amp; operator &gt;&gt; (istream&amp; ins, dataStruct&amp; data) 
{ 
    data.dsgnMat.clear(); 
    data.labels.clear(); 

    ins.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n'); 

    //so, besser einfach als kompliziert:
    string line;
    while (getline(ins, line)) {

        record_t recordLine; 
        label_t label; 
        std::tie(recordLine, label) = record_from(line); 

        data.dsgnMat.push_back(std::move(recordLine)); 
        data.labels.push_back(label); 

    }
    return ins; 
} 

//----------------------------------------------------------------------------- 
// Now to put it all to use. 
int main() 
{ 
    // Here is the data we want. 
    dataStruct data; 

    // Here is the file containing the data. Read it into data. 
    ifstream infile(&quot;test.txt&quot;); 

    try { //jetzt mit ausnahmebehandlung.
      infile &gt;&gt; data; 
    } catch (...) {
      for (int i = 0; i &lt; 100; ++i) 
         cout &lt;&lt; &quot;ich hätte exceptions nicht ansprechen sollen.&quot;;
      return -1;
    }

    // Complain if something went wrong. 
    if (!infile) //nicht eof! - eof steht für &quot;end of file&quot; 
    { 
        cout &lt;&lt; &quot;something went wrong!\n&quot;; 
        return 1; 
    } 

    //zum testen:
    for (auto const&amp; row: data.dsgnMat) {
        for (auto&amp;&amp; value: row) {
            cout &lt;&lt; value &lt;&lt; &quot;; &quot;;
        }
        cout &lt;&lt; endl;
    }

    //das close am ende ist unnötig, die arbeit übernimmt der destruktor von infile
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2502488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502488</guid><dc:creator><![CDATA[dove]]></dc:creator><pubDate>Fri, 15 Jul 2016 18:47:26 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Sat, 16 Jul 2016 06:34:30 GMT]]></title><description><![CDATA[<p>Hallo Sewing,</p>
<p>du solltest aber dann schnellstens lernen mit dem Debugger zu arbeiten, um solche Fehler zu analysieren und dann beheben zu können. Welche IDE benutzt du denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502516</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sat, 16 Jul 2016 06:34:30 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Sat, 16 Jul 2016 07:28:28 GMT]]></title><description><![CDATA[<p>Visual Studio Community. Ja das stimmt, ich habe da Nachholbedarf und werde mir das schnellstmöglich aneignen. Leider funktioniert der obige Code immer noch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title="=/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502523</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Sat, 16 Jul 2016 07:28:28 GMT</pubDate></item><item><title><![CDATA[Reply to Einlesen von daten file on Sat, 16 Jul 2016 08:16:40 GMT]]></title><description><![CDATA[<p>Unter <a href="http://www.cprogramming.com/tutorial/debugging_concepts.html" rel="nofollow">Debugging with Visual Studio 2005/2008, Part 1: Debugging Concepts</a> ff. (besonders Part 3) kriegst du einen guten Überblick über die Möglichkeiten.</p>
<p>Kurzhinweis:<br />
Breakpoint setzen (Links-Klick auf linken Zeilenrand oder F9)<br />
Programm im Debugmodus starten<br />
Warten bis Breakpoint erreicht wird<br />
Im Einzelschritt (F10) die Zeilen ausführen (dann kannst du den Ablauf verfolgen und siehst im Watch-Fenster die aktuellen Variableninhalte)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502531</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sat, 16 Jul 2016 08:16:40 GMT</pubDate></item></channel></rss>