<?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[Datei zeilenweise einlesen]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgende Funktion zum zeilenweisen einlesen von Dateien<br />
geschrieben. Innerhalb der Funktion funktioniert alles wie gewünscht,<br />
allerdings kriege ich es nicht hin, die eingelesenen Zeilen nach außen<br />
zu geben. Dort sind die Inhalte des Vektors (nicht der Vektor) leider<br />
leer. Ich vermute, dass es an dem Gültigkeitsbereich der Variable line<br />
liegt. Leider weiss ich nicht, wie ich das lösen kann. Kann mir jemand<br />
kurz helfen? Danke. Hier mein Erguss:</p>
<p>const std::vector<a href="std::string" rel="nofollow">std::string</a> Database::getOrte() const {</p>
<p>// Oeffne Datei<br />
std::ifstream ifs(dataBaseFile.c_str(), std::ios_base::in);</p>
<p>// Datei geoffnet ?<br />
if (!ifs) {<br />
std::cout &lt;&lt; &quot;Cannot open file.&quot;;<br />
}</p>
<p>std::vector<a href="std::string" rel="nofollow">std::string</a> lines;<br />
std::string line;<br />
while (!ifs.eof()) {<br />
std::getline(ifs, line);<br />
lines.push_back(line);<br />
}</p>
<p>// Dateizugriff aufraeumen<br />
ifs.clear();<br />
ifs.close();</p>
<p>// Liste von Zeilen zurueckgeben<br />
return lines;<br />
}</p>
<p>Ich greife auf die Zeilen von Außen wie folgt zu:</p>
<p>vector&lt;string&gt; orte = database.getOrte();<br />
vector&lt;string&gt;::iterator iOrteOuter;<br />
for (iOrteOuter = orte.begin(); iOrteOuter &lt; orte.end(); +<br />
+iOrteOuter) {<br />
cout &lt;&lt; *iOrteOuter;<br />
}</p>
<p>In der Ausgabe erhalte ich dann leider nur leere Zeilen. Muss ich an<br />
irgendeiner stelle noch etwas dereferenzieren oder die zeile anders<br />
anders an lines.push_back(line); übergeben?</p>
<p>Danke,</p>
<p>Maciek</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218357/datei-zeilenweise-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 06:29:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218357.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Jul 2008 22:40:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datei zeilenweise einlesen on Sat, 19 Jul 2008 22:40:59 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgende Funktion zum zeilenweisen einlesen von Dateien<br />
geschrieben. Innerhalb der Funktion funktioniert alles wie gewünscht,<br />
allerdings kriege ich es nicht hin, die eingelesenen Zeilen nach außen<br />
zu geben. Dort sind die Inhalte des Vektors (nicht der Vektor) leider<br />
leer. Ich vermute, dass es an dem Gültigkeitsbereich der Variable line<br />
liegt. Leider weiss ich nicht, wie ich das lösen kann. Kann mir jemand<br />
kurz helfen? Danke. Hier mein Erguss:</p>
<p>const std::vector<a href="std::string" rel="nofollow">std::string</a> Database::getOrte() const {</p>
<p>// Oeffne Datei<br />
std::ifstream ifs(dataBaseFile.c_str(), std::ios_base::in);</p>
<p>// Datei geoffnet ?<br />
if (!ifs) {<br />
std::cout &lt;&lt; &quot;Cannot open file.&quot;;<br />
}</p>
<p>std::vector<a href="std::string" rel="nofollow">std::string</a> lines;<br />
std::string line;<br />
while (!ifs.eof()) {<br />
std::getline(ifs, line);<br />
lines.push_back(line);<br />
}</p>
<p>// Dateizugriff aufraeumen<br />
ifs.clear();<br />
ifs.close();</p>
<p>// Liste von Zeilen zurueckgeben<br />
return lines;<br />
}</p>
<p>Ich greife auf die Zeilen von Außen wie folgt zu:</p>
<p>vector&lt;string&gt; orte = database.getOrte();<br />
vector&lt;string&gt;::iterator iOrteOuter;<br />
for (iOrteOuter = orte.begin(); iOrteOuter &lt; orte.end(); +<br />
+iOrteOuter) {<br />
cout &lt;&lt; *iOrteOuter;<br />
}</p>
<p>In der Ausgabe erhalte ich dann leider nur leere Zeilen. Muss ich an<br />
irgendeiner stelle noch etwas dereferenzieren oder die zeile anders<br />
anders an lines.push_back(line); übergeben?</p>
<p>Danke,</p>
<p>Maciek</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549991</guid><dc:creator><![CDATA[maciekh]]></dc:creator><pubDate>Sat, 19 Jul 2008 22:40:59 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeilenweise einlesen on Sat, 19 Jul 2008 22:44:49 GMT]]></title><description><![CDATA[<p>wenn du code Tags also [ cpp] und [ /cpp] (ohne das Leerzeichen) verwendest wird dir hier sicher besser geholfen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1549992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549992</guid><dc:creator><![CDATA[ABC-W]]></dc:creator><pubDate>Sat, 19 Jul 2008 22:44:49 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeilenweise einlesen on Sat, 19 Jul 2008 22:51:32 GMT]]></title><description><![CDATA[<p>stimmt, das habe ich übersehen und freue mich auf die Hilfe auf meine Frage.</p>
<pre><code class="language-cpp">const std::vector&lt;std::string&gt; Database::getOrte() const {

               // Oeffne Datei
               std::ifstream ifs(dataBaseFile.c_str(), std::ios_base::in);

               // Datei geoffnet ?
               if (!ifs) {
                       std::cout &lt;&lt; &quot;Cannot open file.&quot;;
               }

               std::vector&lt;std::string&gt; lines;
               std::string line;
               while (!ifs.eof()) {
                       std::getline(ifs, line);
                       lines.push_back(line);
               }

               // Dateizugriff aufraeumen
               ifs.clear();
               ifs.close();

               // Liste von Zeilen zurueckgeben
               return lines;
       }
</code></pre>
<p>Ich greife auf den Vector wie folgt aus einer anderen Klasse zu:</p>
<pre><code class="language-cpp">vector&lt;string&gt; orte = database.getOrte();
       vector&lt;string&gt;::iterator iOrteOuter;
       for (iOrteOuter = orte.begin(); iOrteOuter &lt; orte.end(); +
+iOrteOuter) {
            cout &lt;&lt; *iOrteOuter;
       }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1549995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1549995</guid><dc:creator><![CDATA[maciekh]]></dc:creator><pubDate>Sat, 19 Jul 2008 22:51:32 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeilenweise einlesen on Sun, 20 Jul 2008 04:02:22 GMT]]></title><description><![CDATA[<p>Stimmt der Pfad und ist in der Datei auch was drin?<br />
Wenn die Datei nicht geöffnet werden konnte, solltest du auch nicht weiter machen.<br />
Schon mal nen Debugger verwendet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550023</guid><dc:creator><![CDATA[Coder Bene XIV]]></dc:creator><pubDate>Sun, 20 Jul 2008 04:02:22 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeilenweise einlesen on Sun, 20 Jul 2008 10:29:38 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>der Zugriff stimmt. Ich bekomme wie gewünscht einen Vektor zurück, der hat dann allerdings als Inhalt Referenzen auf line Objekte, die nicht mehr gültig sind, weil die Funktion zum Lesen der Zeilen bereits beendet wurde. Meine konkrete Frage wäre daher, wie ich die Zeilen so auslese und übergebe, dass sie dauerhaft sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550098</guid><dc:creator><![CDATA[maciekh]]></dc:creator><pubDate>Sun, 20 Jul 2008 10:29:38 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeilenweise einlesen on Sun, 20 Jul 2008 11:36:11 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>habe mir die Funktionen noch mal angesehen und das Problem gelöst. Da ich seit mehr als 10 Jahren Java programmiere und mit Cpp nur sporadisch in Berührung komme, hatte ich die Referenzen mal wieder vergessen :-)) Hier ist die Lösung, bei der ein istringstream die lokale Gültigkeit scheinbar durchbricht.</p>
<p>Frage: Ist das richtige Lösung? Muss ich ggf. noch etwas nach der Benutzung der Funktion betrachten? Also insbedondere Freigabe der übertragenen Zeichneketten um Speicherlecks zu vermeiden?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
...
	const std::vector&lt;std::string&gt; Database::getZeilen(const std::string &amp;dataBaseFile) const {

		// Oeffne Datei
		std::ifstream ifs(dataBaseFile.c_str(), std::ios_base::in);

		// Datei geoffnet ?
		if (!ifs) {
			std::cout &lt;&lt; &quot;Cannot open file.&quot;;
		}

		std::vector&lt;std::string&gt; lines;
		std::string linebuffer;

		while (std::getline(ifs, linebuffer)) {
			 :arrow_right: std::istringstream iss(linebuffer);
			 :arrow_right: std::string aLine = &quot;asas&quot;;
			 :arrow_right: iss &gt;&gt; aLine;
			 :arrow_right: lines.push_back(aLine);
		}

		// Dateizugriff aufraeumen
		ifs.clear();
		ifs.close();

		// Liste von Zeilen zurueckgeben
		return lines;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1550131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550131</guid><dc:creator><![CDATA[maciekh]]></dc:creator><pubDate>Sun, 20 Jul 2008 11:36:11 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeilenweise einlesen on Sun, 20 Jul 2008 12:05:08 GMT]]></title><description><![CDATA[<p>Das ist vollkommen unnötig was du da machst, der erste Code funktioniert genauso. Mit lines.push_back fügst du immer eine Kopie des Strings in den Vector ein. Und bei return lines; wird dann eine Kopie von allem an die Aufrufstelle zurückgegeben. Das hat mit Referenzen überhaupts nichts zu tun. Und der Gültigkeitsbereich eines Strings ändert sich nicht, wenn man ihn Durch einen Stream schiebt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550149</guid><dc:creator><![CDATA[Coder Bene XIV]]></dc:creator><pubDate>Sun, 20 Jul 2008 12:05:08 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeilenweise einlesen on Sun, 20 Jul 2008 13:12:04 GMT]]></title><description><![CDATA[<p>Coder Bene XIV schrieb:</p>
<blockquote>
<p>Das ist vollkommen unnötig was du da machst, der erste Code funktioniert genauso. Mit lines.push_back fügst du immer eine Kopie des Strings in den Vector ein. Und bei return lines; wird dann eine Kopie von allem an die Aufrufstelle zurückgegeben. Das hat mit Referenzen überhaupts nichts zu tun. Und der Gültigkeitsbereich eines Strings ändert sich nicht, wenn man ihn Durch einen Stream schiebt.</p>
</blockquote>
<p>Hallo Coder Bene XIV,</p>
<p>der erste Code hat nicht funktioniert. Ich bekomme beim Auslesen dann nur leere Zeichenketten zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550192</guid><dc:creator><![CDATA[maciekh]]></dc:creator><pubDate>Sun, 20 Jul 2008 13:12:04 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeilenweise einlesen on Sun, 20 Jul 2008 13:59:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">const std::vector&lt;std::string&gt; getOrte() {

           // Oeffne Datei
	 std::ifstream ifs(&quot;C:\\test.txt&quot;, std::ios_base::in);

           // Datei geoffnet ?
           if (!ifs) {
                   std::cout &lt;&lt; &quot;Cannot open file.&quot;;
           }

           std::vector&lt;std::string&gt; lines;
           std::string line;
           while (!ifs.eof()) {
                   std::getline(ifs, line);
                   lines.push_back(line);
           }

           // Dateizugriff aufraeumen
           ifs.clear();
           ifs.close();

           // Liste von Zeilen zurueckgeben
           return lines;
   } 
int main () {  

	std::vector&lt;std::string&gt; orte = getOrte();
	std::vector&lt;std::string&gt;::iterator iOrteOuter;
      for (iOrteOuter = orte.begin(); iOrteOuter &lt; orte.end(); ++iOrteOuter) {
		  std::cout &lt;&lt; *iOrteOuter;
       } 
    return 0;
}
</code></pre>
<p>Gibt bei mir was aus, wenns die Datei gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550221</guid><dc:creator><![CDATA[Coder Bene XIV]]></dc:creator><pubDate>Sun, 20 Jul 2008 13:59:09 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeilenweise einlesen on Sun, 20 Jul 2008 14:01:29 GMT]]></title><description><![CDATA[<p>Kann es sein, dass der Unterschied daher kommt, dass bei mir die Funktion in einer eigenen Klasse definiert ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550222</guid><dc:creator><![CDATA[maciekh]]></dc:creator><pubDate>Sun, 20 Jul 2008 14:01:29 GMT</pubDate></item><item><title><![CDATA[Reply to Datei zeilenweise einlesen on Sun, 20 Jul 2008 14:06:46 GMT]]></title><description><![CDATA[<p>maciekh schrieb:</p>
<blockquote>
<p>Kann es sein, dass der Unterschied daher kommt, dass bei mir die Funktion in einer eigenen Klasse definiert ist?</p>
</blockquote>
<p>Hier der Quellcode des Header und der Klasse:</p>
<pre><code class="language-cpp">/*
 * Database.h
 */

#ifndef DATABASE_H_
#define DATABASE_H_

#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;

using namespace std;

namespace hw {

	class Database {

	public:

		// Constructor
		Database(const string &amp;fileName);

		// Constructor
		virtual ~Database();

		// Initialisiere Datenbank
		void init();

		// Lese Orte aus der datenbank
		const vector&lt;string&gt; getOrte();

	private:

		const string dataBaseFile;

	};
}
#endif /* DATABASE_H_ */
</code></pre>
<pre><code class="language-cpp">/*
 * Database.cpp
 *
 *  Created on: 14.07.2008
 *  Author: mab
 */
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
#include &quot;Database.h&quot;

using namespace std;

namespace hw {

	Database::Database(const std::string &amp; fileName) :
		dataBaseFile(fileName) {
		std::cout &lt;&lt; &quot;constructed -&gt; database: &quot; &lt;&lt; dataBaseFile &lt;&lt; std::endl;
	}

	Database::~Database() {
		std::cout &lt;&lt; &quot;deconstructed -&gt; database: &quot; &lt;&lt; dataBaseFile &lt;&lt; std::endl;
	}

	void Database::init() {
		std::cout &lt;&lt; &quot;init --&gt; database: &quot; &lt;&lt; dataBaseFile &lt;&lt; std::endl;
	}

	const std::vector&lt;std::string&gt; Database::getOrte() const {

		// Oeffne Datei
		std::ifstream ifs(dataBaseFile.c_str(), std::ios_base::in);

		// Datei geoffnet ?
		if (!ifs) {
			std::cout &lt;&lt; &quot;Cannot open file.&quot;;
		}

		std::vector&lt;std::string&gt; lineVector;
		std::string linebuffer;

		while (std::getline(ifs, linebuffer)) {
			std::istringstream iss(linebuffer);
			std::string aLine = &quot;empty&quot;;
			iss &gt;&gt; aLine;
			lineVector.push_back(aLine.c_str());
		}

		// Dateizugriff aufraeumen
		ifs.clear();
		ifs.close();

		// Liste von Orten zurueckgeben
		return lineVector;
	}

}
</code></pre>
<p>Und der Aufruf:</p>
<pre><code class="language-cpp">#include &quot;Database.h&quot;

using namespace std;
using namespace hw;
...
	Database database(&quot;orte.txt&quot;);
	database.init();
	vector&lt;string&gt; orte = database.getOrte();
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1550230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550230</guid><dc:creator><![CDATA[maciekh]]></dc:creator><pubDate>Sun, 20 Jul 2008 14:06:46 GMT</pubDate></item></channel></rss>