<?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[Programmzugriff auf Textdatei]]></title><description><![CDATA[<p>Hallo! Das ist meine erste Frage hier und ich hoffe,<br />
dass mir Jemand weiterhelfen kann. Ich stelle diese Frage, weil ich mit meinem Programm nicht &quot;falsch&quot; anfangen möchte und mir noch Informationen für die Umsetzung fehlen.</p>
<p>Mit meinem Programm möchte ich Matrizen aus einer Datei einlesen (beliebig viele) und sie später nach bestimmten Kriterien raussuchen und sortieren und ggf. in einer anderen Datei abspeichern. Die Matrizen liegen z.B. in dieser Form vor und können maximal 100x100 groß sein:</p>
<blockquote>
<p>1 1 (größe der Matrix 1x1) (int-Werte)<br />
2 (Element der Matrix) (double-Werte)</p>
<p>2 2<br />
3 1<br />
1 3<br />
. . .</p>
</blockquote>
<p><strong>1. Problem:</strong> Da ist nicht weiß wieviel Speicher ich benötigen werde, muss ich diesen wohl dynamisch für ein Array der Größe, der Matrix reservieren lassen.<br />
1. Frage: Wie sage ich meinem Programm am Besten, wieviel Speicher reserviert werden muss? Reicht die Auskunft über Zeile * Spalte, um den zu benötigenden Speicher auszurechnen und anschließend freizugeben oder gibt es bereits Funktionen, die mir das beim Einlesen abnehmen?<br />
Und Somit komme ich auch zum<br />
<strong>2. Problem:</strong> Wie lasse ich zwischen Größenangabe der Matrix und der Matrixelemente unterscheiden? Meine Idee war, dass die erste Zeile in der Datei immer eine Größenangabe ist (m * n) und ich dann m+1 Zeilen, in der Datei nach unten gehe um zur nächsten Größenangabe zu kommen. Wenn es eine bessere Methode dafür gibt, benutze ich die auch gerne, ansonsten müsste ich noch wissen wie ich in eine Datei überhaupt Zeile für Zeile einlesen kann bzw. wie die Funktion in C++ dafür heißt.</p>
<p>Über Beispiele, ähnliche Fragen oder Hinweise zu bereits vorhandenen Funktionen würd' ich mich sehr freuen</p>
<p>Grüße <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/303344/programmzugriff-auf-textdatei</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 14:46:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303344.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 May 2012 09:39:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Programmzugriff auf Textdatei on Fri, 11 May 2012 09:39:02 GMT]]></title><description><![CDATA[<p>Hallo! Das ist meine erste Frage hier und ich hoffe,<br />
dass mir Jemand weiterhelfen kann. Ich stelle diese Frage, weil ich mit meinem Programm nicht &quot;falsch&quot; anfangen möchte und mir noch Informationen für die Umsetzung fehlen.</p>
<p>Mit meinem Programm möchte ich Matrizen aus einer Datei einlesen (beliebig viele) und sie später nach bestimmten Kriterien raussuchen und sortieren und ggf. in einer anderen Datei abspeichern. Die Matrizen liegen z.B. in dieser Form vor und können maximal 100x100 groß sein:</p>
<blockquote>
<p>1 1 (größe der Matrix 1x1) (int-Werte)<br />
2 (Element der Matrix) (double-Werte)</p>
<p>2 2<br />
3 1<br />
1 3<br />
. . .</p>
</blockquote>
<p><strong>1. Problem:</strong> Da ist nicht weiß wieviel Speicher ich benötigen werde, muss ich diesen wohl dynamisch für ein Array der Größe, der Matrix reservieren lassen.<br />
1. Frage: Wie sage ich meinem Programm am Besten, wieviel Speicher reserviert werden muss? Reicht die Auskunft über Zeile * Spalte, um den zu benötigenden Speicher auszurechnen und anschließend freizugeben oder gibt es bereits Funktionen, die mir das beim Einlesen abnehmen?<br />
Und Somit komme ich auch zum<br />
<strong>2. Problem:</strong> Wie lasse ich zwischen Größenangabe der Matrix und der Matrixelemente unterscheiden? Meine Idee war, dass die erste Zeile in der Datei immer eine Größenangabe ist (m * n) und ich dann m+1 Zeilen, in der Datei nach unten gehe um zur nächsten Größenangabe zu kommen. Wenn es eine bessere Methode dafür gibt, benutze ich die auch gerne, ansonsten müsste ich noch wissen wie ich in eine Datei überhaupt Zeile für Zeile einlesen kann bzw. wie die Funktion in C++ dafür heißt.</p>
<p>Über Beispiele, ähnliche Fragen oder Hinweise zu bereits vorhandenen Funktionen würd' ich mich sehr freuen</p>
<p>Grüße <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2210467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210467</guid><dc:creator><![CDATA[Elliot000]]></dc:creator><pubDate>Fri, 11 May 2012 09:39:02 GMT</pubDate></item><item><title><![CDATA[Reply to Programmzugriff auf Textdatei on Fri, 11 May 2012 10:01:32 GMT]]></title><description><![CDATA[<p>Werner wird mich nun vermutlich prügeln, weil ich zeilenweise parse, aber ein einfacher Ansatz wäre sowas:</p>
<pre><code class="language-cpp">std::ifstream reader(&quot;matrix.txt&quot;);
std::vector&lt;std::vector&lt;double&gt; &gt; matrix;
for(std::string line; std::getline(reader, line, '\n'); )
{
    std::istringstream isstr(line);
    std::vector&lt;double&gt; row;
    for(double matrix_element; isstr &gt;&gt; matrix_element; )
    {
        row.push_back(matrix_element);
    }
    matrix.push_back(row);
}
std::cout &lt;&lt; &quot;Number rows: &quot; &lt;&lt; matrix.size() &lt;&lt; '\n';
std::cout &lt;&lt; &quot;Number cols: &quot; &lt;&lt; matrix[0].size() &lt;&lt; '\n'; //Achtung: matrix kann leer sein.
std::cout &lt;&lt; &quot;First element: &quot; &lt;&lt; matrix[0][0] &lt;&lt; '\n';  //Achtung: matrix kann leer sein.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2210475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210475</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 11 May 2012 10:01:32 GMT</pubDate></item><item><title><![CDATA[Reply to Programmzugriff auf Textdatei on Fri, 11 May 2012 12:48:14 GMT]]></title><description><![CDATA[<p>Hallo und Danke für die Antwort!</p>
<p>Habe es gerade mal getestet und versucht zu verstehen.<br />
Also bisher gehe ich bis zur letzten Zeile in der Datei(=Number rows), egal ob nach der ersten Matrix noch eine Matrix kommt oder nicht.<br />
Und ein Space wird immer als neue Spalte angesehen. Dadurch wirkt sich die Größenangabe z.B. &quot; 1 1 &quot; auf die Spalten der Matrix mit aus.<br />
Bsp.: 1 1 (Größenangabe)<br />
3 (Element)</p>
<p>=&gt; Spalten = 2</p>
<p>Das First Element ist bei mir dann einfach immer die erste Zahl in der Textdatei.</p>
<p>Mein Ziel ist es ja jetzt erstmal die einzelnen Matrizen inkl. Größenangabe als getrennte Objekte anzusehen mit denen ich später noch arbeiten kann.<br />
Ist das über diesen Weg überhaupt möglich? Wenn ja muss ich es mir wohl nochmal gründlicher anschauen. <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>
<p>Mit dieser Zeile hier habe ich auch Probleme:</p>
<pre><code>std::vector&lt;std::vector&lt;double&gt; &gt; matrix;
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210534</guid><dc:creator><![CDATA[Elliot000]]></dc:creator><pubDate>Fri, 11 May 2012 12:48:14 GMT</pubDate></item><item><title><![CDATA[Reply to Programmzugriff auf Textdatei on Fri, 11 May 2012 13:02:57 GMT]]></title><description><![CDATA[<p>Kleiner Vorschlag: Nimm für die Spalten ein <code>std::array</code> , da die Anzahl der Spalten (also der Eigenschaften einer Entity) ja schon vorher feststehen müssten.</p>
<pre><code class="language-cpp">std::vector&lt;std::vector&lt;double&gt; &gt; matrix;
</code></pre>
<p>Wie du sicher wissen solltest, kann man als Template-Parameter jeden Typ übergeben **(**ob es dann kein <code>static_assert</code> o.ä. gibt, ist eine andere Frage <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> , und nebenbei sei auch bemerkt dass Container bestimmte Anforderungen an die übergebenen Typen stellen <strong>(<strong>die auch von den benutzten Funktionen abhängen</strong>))</strong>, also auch Klassen. In diesem Fall wird einfach ein vector mit vectors gefüllt, die wiederum mit Fließkommazahlen gefüllt werden (ein einfaches Multi-Dimensionales Array).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210539</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 11 May 2012 13:02:57 GMT</pubDate></item><item><title><![CDATA[Reply to Programmzugriff auf Textdatei on Fri, 11 May 2012 14:15:05 GMT]]></title><description><![CDATA[<blockquote>
<p>In diesem Fall wird einfach ein vector mit vectors gefüllt, die wiederum mit Fließkommazahlen gefüllt werden (ein einfaches Multi-Dimensionales Array).</p>
</blockquote>
<p>Nein, das sollte man eher als Liste von Listen betrachten und nicht als multidimensionales Array. Mag zwar wie Haarspalterei klingen, ist aber ein Unterschied.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210575</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 11 May 2012 14:15:05 GMT</pubDate></item><item><title><![CDATA[Reply to Programmzugriff auf Textdatei on Fri, 11 May 2012 14:49:40 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<blockquote>
<p>In diesem Fall wird einfach ein vector mit vectors gefüllt, die wiederum mit Fließkommazahlen gefüllt werden (ein einfaches Multi-Dimensionales Array).</p>
</blockquote>
<p>Nein, das sollte man eher als Liste von Listen betrachten und nicht als multidimensionales Array. Mag zwar wie Haarspalterei klingen, ist aber ein Unterschied.</p>
</blockquote>
<p>Ja, du hast recht, ist es weil die Länge der <em>Listen</em> nicht festgelegt ist? Wäre es ein MD-Array, wenn es statt <code>std::vector std::array</code> verwendet hätte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210589</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 11 May 2012 14:49:40 GMT</pubDate></item><item><title><![CDATA[Reply to Programmzugriff auf Textdatei on Fri, 11 May 2012 15:06:54 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<blockquote>
<p>In diesem Fall wird einfach ein vector mit vectors gefüllt, die wiederum mit Fließkommazahlen gefüllt werden (ein einfaches Multi-Dimensionales Array).</p>
</blockquote>
<p>Nein, das sollte man eher als Liste von Listen betrachten und nicht als multidimensionales Array. Mag zwar wie Haarspalterei klingen, ist aber ein Unterschied.</p>
</blockquote>
<p>Ja, du hast recht, ist es weil die Länge der <em>Listen</em> nicht festgelegt ist? Wäre es ein MD-Array, wenn es statt <code>std::vector std::array</code> verwendet hätte?</p>
</blockquote>
<p>Ich würde es immer als multidimensionales Array bezeichnen, da ich für mich Zeilen und Spalten betrachte.</p>
<p>Wenn du <code>vector&lt;vector&gt;</code> hast, ist sowohl Anzahl Zeilen als auch die Anzahl Spalten dynamisch:</p>
<pre><code>6 3 7 2
4 6
7 3 1 6 2 5
. . . 
. . . . 
.
</code></pre>
<p>Wenn du <code>vector&lt;array&gt;</code> hast, ist die Zeilenanzahl dynamisch und die Spaltenanzahl statisch:</p>
<pre><code>6 3
4 6
7 3
. .
. .
. .
</code></pre>
<p>Wenn du <code>array&lt;array&gt;</code> hast, ist sowohl die Anzahl Zeilen als auch die Anzahl Spalten statisch:</p>
<pre><code>6 3
4 6
7 3
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2210598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210598</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 11 May 2012 15:06:54 GMT</pubDate></item><item><title><![CDATA[Reply to Programmzugriff auf Textdatei on Fri, 11 May 2012 15:20:27 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<blockquote>
<p>In diesem Fall wird einfach ein vector mit vectors gefüllt, die wiederum mit Fließkommazahlen gefüllt werden (ein einfaches Multi-Dimensionales Array).</p>
</blockquote>
<p>Nein, das sollte man eher als Liste von Listen betrachten und nicht als multidimensionales Array. Mag zwar wie Haarspalterei klingen, ist aber ein Unterschied.</p>
</blockquote>
<p>Ja, du hast recht, ist es weil die Länge der <em>Listen</em> nicht festgelegt ist? Wäre es ein MD-Array, wenn es statt <code>std::vector std::array</code> verwendet hätte?</p>
</blockquote>
<p>Ich würde es immer als multidimensionales Array bezeichnen, da ich für mich Zeilen und Spalten betrachte.</p>
<p>Wenn du <code>vector&lt;vector&gt;</code> hast, ist sowohl Anzahl Zeilen als auch die Anzahl Spalten dynamisch:</p>
<pre><code>6 3 7 2
4 6
7 3 1 6 2 5
. . . 
. . . . 
.
</code></pre>
<p>Wenn du <code>vector&lt;array&gt;</code> hast, ist die Zeilenanzahl dynamisch und die Spaltenanzahl statisch:</p>
<pre><code>6 3
4 6
7 3
. .
. .
. .
</code></pre>
<p>Wenn du <code>array&lt;array&gt;</code> hast, ist sowohl die Anzahl Zeilen als auch die Anzahl Spalten statisch:</p>
<pre><code>6 3
4 6
7 3
</code></pre>
</blockquote>
<p>Das ist mir sehr klar. Ich schlug Variante Zwei vor.<br />
Allerdings hat Ethon IMO Recht. Denn eine Liste ist ja nicht auf Länge beschränkt. Also würde ich erst Variante Zwei/Drei als Zweidimensionales Array ansehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210605</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 11 May 2012 15:20:27 GMT</pubDate></item><item><title><![CDATA[Reply to Programmzugriff auf Textdatei on Sat, 12 May 2012 10:42:46 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich bin jetzt etwas verwirrt.<br />
Ich lese die Datei zeilenweise ein. Und wie ich mir zu Beginn schon überlegt habe, erkenne ich die Matrix daran, dass sie einfach nach der Größenangabe kommt. Die Größenangabe steht ganz am Anfang der Datei. Beim ersten mal gehen die Matrixelemente also bei Stelle matrix[1][0] los. Die nächste Größenangabe kommt dann bei Zeile(größenangabe)+2. (Zwischen den Matrizen ist immer eine Zeile frei).<br />
Ich schaffe es nicht den Codeausschnitt so umzuschreiben, dass die Matrizen ersteinmal getrennt sind.<br />
-&gt; Deshalb wollte ich jetzt VisualStudio10 benutzen und Schritt für Schritt durch den Code. Vielleicht habe ich ihn immernoch nicht ganz verstanden.<br />
Da bekomme ich allerdings folgende Meldung beim Ausführen des Programms:</p>
<blockquote>
<p>&quot;include\vector Line:932 Expression: vector subscript out of range.&quot;</p>
</blockquote>
<p>Includes sind bei mir #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;sstream&gt;<br />
#include &lt;vector&gt; #include &lt;conio.h&gt;<br />
und using namespace std; habe ich auch mal dazu. Und er meckert schon beim unveränderten Code, der zuvor bei Dev-Cpp keine probleme gemacht hat.</p>
<p><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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210781</guid><dc:creator><![CDATA[Elliot000]]></dc:creator><pubDate>Sat, 12 May 2012 10:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to Programmzugriff auf Textdatei on Sat, 12 May 2012 12:24:30 GMT]]></title><description><![CDATA[<p>Hallo Elliot000,<br />
ich habe mal eine Neuauflage gemacht, weil ich befürchte, dass dein Quellcode grausig ist. Falls du Fragen zu folgendem Quellcode hast, schieß los.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
using namespace std;

// Diese Klasse muss dich eigentlich nicht interessieren.
// Du kannst sie benutzen wie ein normales zweidimensionales Array, außer dass du statt
// dem Zugriffsoperator [zeile][spalte] (zeile,spalte) schreiben musst.
template&lt;typename T&gt; class array_2d
{
	private:
		vector&lt;T&gt; data;
		unsigned sy;
		unsigned sx;

	public:
		array_2d(unsigned y, unsigned x) : data(y*x), sy(y), sx(x)
		{
		}

		const T&amp; operator()(unsigned y, unsigned x) const
		{
			return data[y*size_x() +x];
		}

		T&amp; operator()(unsigned y, unsigned x)
		{
			return data[y*size_x() +x];
		}

		unsigned size_y() const { return sy; }
		unsigned size_x() const { return sx; }
};

// Alle Matrizen einlesen.
typedef array_2d&lt;double&gt; matrix;
ifstream&amp; operator&gt;&gt;(ifstream&amp; file, vector&lt;matrix&gt;&amp; matrizen)
{
	for(unsigned zeilen=0, spalten=0; file&gt;&gt;zeilen&gt;&gt;spalten;) // Anzahl Zeilen und Spalten einer Matrix einlesen.
	{
		matrix m(zeilen,spalten); // Leere Matrix erzeugen.

		// Matrix füllen.
		for(unsigned z=0; z&lt;zeilen; ++z)
		{
			for(unsigned s=0; s&lt;spalten; ++s)
			{
				double wert;
				file &gt;&gt; wert; // Ein Wert der Matrix einlesen.
				m(z,s) = wert; // Eingelesener Wert entsprechend abspeichern.
			}
		}

		// Gefüllte Matrix abspeichern.
		matrizen.push_back(m);
	}
	return file;
}

int main()
{
	/*
		Aufbau der Textdatei:
			1 1
			2

			2 2
			3 1
			1 3

			3 3
			1 2 3
			4 5 6
			7 8 9
	*/
	ifstream file(&quot;test.txt&quot;);
	if( !file.is_open() )
	{
		cerr &lt;&lt; &quot;failed to open file&quot;;
		return -1;
	}

	// Alle Matrizen einlesen.
	vector&lt;matrix&gt; matrizen;
	file &gt;&gt; matrizen;

	// Testausgaben
	for(vector&lt;matrix&gt;::iterator it=matrizen.begin(); it!=matrizen.end(); ++it)
	{
		matrix m = *it;

		for(unsigned zeilen=0; zeilen!=m.size_y(); ++zeilen)
		{
			for(unsigned spalten=0; spalten!=m.size_x(); ++spalten)
			{
				cout &lt;&lt; m(zeilen,spalten) &lt;&lt; ' ';
			}
			cout &lt;&lt; '\n';
		}
		cout &lt;&lt; '\n';
	}
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2210810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210810</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 12 May 2012 12:24:30 GMT</pubDate></item></channel></rss>