<?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[Dateibearbeitung mit &amp;quot;ifstream&amp;quot; - In Funktion auslagern (Zeigerproblem)]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe wieder ein kleines Verständnisproblem mit Zeigern.</p>
<p>Ich schreibe mir gerade einen ModelLoader-Klasse mit der ich später Models für OpenGL laden kann. Ich habe zuerst die dazugehörige Funktion einfach runtergeschrieben mit sich wiederholendem Code. Wo die Hauptfunktion nun funktioniert wollte ich ein Paar sich wiederholende Codeabschnitt in eine Funktion packen. Hier ist mein Problem.</p>
<p>Ich öffne eine Datei mit <em>ifstream</em>. Danach prüfe ich wie viele Vertices ich in einer Datei habe mit folgendem Code:</p>
<pre><code class="language-cpp">while(!ifs.eof())
	{
		string line;
		getline(ifs, line);

		if(line.find(&quot;v  &quot;) != string::npos)
			verticesCount++;
	}

	vertices = new GLfloat[verticesCount*3];
	verticesCount = 0;

	ifs.clear();
	ifs.seekg(0, ios::beg);
</code></pre>
<p>Das ganze möchte ich jetzt gerne in eine private Klassenfunktion auslagern. Das bekomme ich leider nicht hin. Hier mein Ansatz:</p>
<pre><code class="language-cpp">int ModelLoader::count(ifstream *ifs, string s)
{
	int counter = 0;

	while(!ifs-&gt;eof())
	{
		string line;
		getline(*ifs, line);

		if(line.find(s.c_str()) != string::npos)
			counter++;
	}

	ifs-&gt;clear();
	ifs-&gt;seekg(0, ios::beg);

	return counter;
}
</code></pre>
<p>Das merkwürdige ist, das ich das Programm im Debug-Modus ausführen kann, jedoch das Model fehlerhaft ist.</p>
<p>Vll. ist aber mein Ansatz auch komplett falsch alles mit Zeigern zu lösen.</p>
<p>Wenn ich es nämlich ohne Zeiger, mit einfacher Parameterübergabe versuche bekomme ich folgende Fehlermeldung.</p>
<pre><code>error C2248: &quot;std::basic_ios&lt;_Elem,_Traits&gt;::basic_ios&quot;: Kein Zugriff auf private Member, dessen Deklaration in der std::basic_ios&lt;_Elem,_Traits&gt;-Klasse erfolgte.
1&gt;          with
1&gt;          [
1&gt;              _Elem=char,
1&gt;              _Traits=std::char_traits&lt;char&gt;
1&gt;          ]
1&gt;          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(176): Siehe Deklaration von 'std::basic_ios&lt;_Elem,_Traits&gt;::basic_ios'
1&gt;          with
1&gt;          [
1&gt;              _Elem=char,
1&gt;              _Traits=std::char_traits&lt;char&gt;
1&gt;          ]
1&gt;          Diese Diagnose trat in der vom Compiler generierten Funktion &quot;std::basic_ifstream&lt;_Elem,_Traits&gt;::basic_ifstream(const std::basic_ifstream&lt;_Elem,_Traits&gt; &amp;)&quot; auf.
1&gt;          with
1&gt;          [
1&gt;              _Elem=char,
1&gt;              _Traits=std::char_traits&lt;char&gt;
1&gt;          ]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/306715/dateibearbeitung-mit-quot-ifstream-quot-in-funktion-auslagern-zeigerproblem</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 16:40:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306715.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 05 Aug 2012 17:20:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dateibearbeitung mit &amp;quot;ifstream&amp;quot; - In Funktion auslagern (Zeigerproblem) on Sun, 05 Aug 2012 17:20:14 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe wieder ein kleines Verständnisproblem mit Zeigern.</p>
<p>Ich schreibe mir gerade einen ModelLoader-Klasse mit der ich später Models für OpenGL laden kann. Ich habe zuerst die dazugehörige Funktion einfach runtergeschrieben mit sich wiederholendem Code. Wo die Hauptfunktion nun funktioniert wollte ich ein Paar sich wiederholende Codeabschnitt in eine Funktion packen. Hier ist mein Problem.</p>
<p>Ich öffne eine Datei mit <em>ifstream</em>. Danach prüfe ich wie viele Vertices ich in einer Datei habe mit folgendem Code:</p>
<pre><code class="language-cpp">while(!ifs.eof())
	{
		string line;
		getline(ifs, line);

		if(line.find(&quot;v  &quot;) != string::npos)
			verticesCount++;
	}

	vertices = new GLfloat[verticesCount*3];
	verticesCount = 0;

	ifs.clear();
	ifs.seekg(0, ios::beg);
</code></pre>
<p>Das ganze möchte ich jetzt gerne in eine private Klassenfunktion auslagern. Das bekomme ich leider nicht hin. Hier mein Ansatz:</p>
<pre><code class="language-cpp">int ModelLoader::count(ifstream *ifs, string s)
{
	int counter = 0;

	while(!ifs-&gt;eof())
	{
		string line;
		getline(*ifs, line);

		if(line.find(s.c_str()) != string::npos)
			counter++;
	}

	ifs-&gt;clear();
	ifs-&gt;seekg(0, ios::beg);

	return counter;
}
</code></pre>
<p>Das merkwürdige ist, das ich das Programm im Debug-Modus ausführen kann, jedoch das Model fehlerhaft ist.</p>
<p>Vll. ist aber mein Ansatz auch komplett falsch alles mit Zeigern zu lösen.</p>
<p>Wenn ich es nämlich ohne Zeiger, mit einfacher Parameterübergabe versuche bekomme ich folgende Fehlermeldung.</p>
<pre><code>error C2248: &quot;std::basic_ios&lt;_Elem,_Traits&gt;::basic_ios&quot;: Kein Zugriff auf private Member, dessen Deklaration in der std::basic_ios&lt;_Elem,_Traits&gt;-Klasse erfolgte.
1&gt;          with
1&gt;          [
1&gt;              _Elem=char,
1&gt;              _Traits=std::char_traits&lt;char&gt;
1&gt;          ]
1&gt;          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(176): Siehe Deklaration von 'std::basic_ios&lt;_Elem,_Traits&gt;::basic_ios'
1&gt;          with
1&gt;          [
1&gt;              _Elem=char,
1&gt;              _Traits=std::char_traits&lt;char&gt;
1&gt;          ]
1&gt;          Diese Diagnose trat in der vom Compiler generierten Funktion &quot;std::basic_ifstream&lt;_Elem,_Traits&gt;::basic_ifstream(const std::basic_ifstream&lt;_Elem,_Traits&gt; &amp;)&quot; auf.
1&gt;          with
1&gt;          [
1&gt;              _Elem=char,
1&gt;              _Traits=std::char_traits&lt;char&gt;
1&gt;          ]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2239017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239017</guid><dc:creator><![CDATA[aptem]]></dc:creator><pubDate>Sun, 05 Aug 2012 17:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to Dateibearbeitung mit &amp;quot;ifstream&amp;quot; - In Funktion auslagern (Zeigerproblem) on Sun, 05 Aug 2012 17:26:02 GMT]]></title><description><![CDATA[<p>OK, habs selber hinbekommen <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>
<pre><code class="language-cpp">int ModelLoader::count(ifstream &amp;ifs, string s)
{
	int counter = 0;

	while(!ifs.eof())
	{
		string line;
		getline(ifs, line);

		if(line.find(s.c_str()) != string::npos)
			counter++;
	}

	ifs.clear();
	ifs.seekg(0, ios::beg);

	return counter;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2239018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239018</guid><dc:creator><![CDATA[aptem]]></dc:creator><pubDate>Sun, 05 Aug 2012 17:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to Dateibearbeitung mit &amp;quot;ifstream&amp;quot; - In Funktion auslagern (Zeigerproblem) on Sun, 05 Aug 2012 18:02:04 GMT]]></title><description><![CDATA[<p>Der Schleifenkörper von <code>while(!eof()){ ... }</code> wird einmal mehr ausgeführt als Zeilen da sind.<br />
Bewährt hat sich ein anderes Idiom.(s.u.).</p>
<p>Z.B. siehst Du in der Ausgabe dieses Programms eine Leerzeile vor &quot;&lt;/Test1&gt;&quot;:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;

int main(){
  using namespace std;
  const string filename{&quot;./test.cc&quot;};  // test.cc ist dieser source
  cout &lt;&lt; &quot;&lt;Test1&gt;\n&quot;;
  {
    ifstream stream{filename};
    while(!stream.eof()){
      string s;
      getline(stream, s);
      cout &lt;&lt; s &lt;&lt; '\n';
    }
  }
  cout &lt;&lt; &quot;&lt;/Test1&gt;\n&lt;Test2&gt;\n&quot;;
  {
    ifstream stream{filename};
    for(string s; getline(stream, s);)
      cout &lt;&lt; s &lt;&lt; '\n';
  }
  cout &lt;&lt; &quot;&lt;/Test2&gt;\n&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2239023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239023</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Sun, 05 Aug 2012 18:02:04 GMT</pubDate></item></channel></rss>