<?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[(Für mich) seltsames Verhalten]]></title><description><![CDATA[<p>Ich möchte mehrere Dateien einlesen, und diese dann zusammengepackt in einer Datei wieder speichern. Damit die Schnelligekit nicht so sehr an der Festplatte leidet, habe ich mir gedacht erst eine Datei in einem Container zwischenzuspeichern und den dann mit einem Mal zu schreiben.<br />
Hier ist der Code:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;vector&gt;

using namespace std;

void processFile(string const&amp; filename_in, string const&amp; filename_out) {
	cout &lt;&lt; filename_in;
	ifstream fs(filename_in);
	vector&lt;string&gt; container;
	char buffer[1024];
	try {
		while (fs.getline(buffer,1024))	
			container.push_back(buffer);
	} catch(...) {
		cout &lt;&lt; &quot;Buffer Overflow\nNächste Datei wird eingelesen&quot; &lt;&lt; endl;
	}
	fs.close();
	ofstream os(filename_out, ios::app);
	for (unsigned int i = 0; i &lt; container.size(); ++i) {
		os.write(container[i].c_str(), container[i].size());
	}
	os.close();
}

int _tmain(int argc, _TCHAR* argv[]) {
	for (int i = 1; i &lt;= 38; ++i) {
		stringstream ss;
		ss &lt;&lt; i &lt;&lt; &quot;.txt&quot; &lt;&lt; endl;
		processFile(ss.str(), &quot;words.txt&quot;);
	}
	cout &lt;&lt; &quot;Fertig&quot; &lt;&lt; endl;
	cin.get();
	return 0;
}
</code></pre>
<p>Wenn die Dateien unter 100 MB groß sind, funktioniert auch alles. Nur wenn sie größer als 100 kb sind, alloziiert mein Programm wie ein verrückter Speicher, bis Windows nichts mehr hergibt und abstürzt. Anstatt vector habe ich auch mal deque ausprobiert, das hat es aber auch nicht getan.<br />
Weiß da jemand weiter?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/276576/für-mich-seltsames-verhalten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 09:36:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276576.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 04 Nov 2010 18:33:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to (Für mich) seltsames Verhalten on Thu, 04 Nov 2010 18:33:26 GMT]]></title><description><![CDATA[<p>Ich möchte mehrere Dateien einlesen, und diese dann zusammengepackt in einer Datei wieder speichern. Damit die Schnelligekit nicht so sehr an der Festplatte leidet, habe ich mir gedacht erst eine Datei in einem Container zwischenzuspeichern und den dann mit einem Mal zu schreiben.<br />
Hier ist der Code:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;vector&gt;

using namespace std;

void processFile(string const&amp; filename_in, string const&amp; filename_out) {
	cout &lt;&lt; filename_in;
	ifstream fs(filename_in);
	vector&lt;string&gt; container;
	char buffer[1024];
	try {
		while (fs.getline(buffer,1024))	
			container.push_back(buffer);
	} catch(...) {
		cout &lt;&lt; &quot;Buffer Overflow\nNächste Datei wird eingelesen&quot; &lt;&lt; endl;
	}
	fs.close();
	ofstream os(filename_out, ios::app);
	for (unsigned int i = 0; i &lt; container.size(); ++i) {
		os.write(container[i].c_str(), container[i].size());
	}
	os.close();
}

int _tmain(int argc, _TCHAR* argv[]) {
	for (int i = 1; i &lt;= 38; ++i) {
		stringstream ss;
		ss &lt;&lt; i &lt;&lt; &quot;.txt&quot; &lt;&lt; endl;
		processFile(ss.str(), &quot;words.txt&quot;);
	}
	cout &lt;&lt; &quot;Fertig&quot; &lt;&lt; endl;
	cin.get();
	return 0;
}
</code></pre>
<p>Wenn die Dateien unter 100 MB groß sind, funktioniert auch alles. Nur wenn sie größer als 100 kb sind, alloziiert mein Programm wie ein verrückter Speicher, bis Windows nichts mehr hergibt und abstürzt. Anstatt vector habe ich auch mal deque ausprobiert, das hat es aber auch nicht getan.<br />
Weiß da jemand weiter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975286</guid><dc:creator><![CDATA[Denksportler]]></dc:creator><pubDate>Thu, 04 Nov 2010 18:33:26 GMT</pubDate></item><item><title><![CDATA[Reply to (Für mich) seltsames Verhalten on Thu, 04 Nov 2010 18:50:48 GMT]]></title><description><![CDATA[<p>Denksportler schrieb:</p>
<blockquote>
<p>Damit die Schnelligekit nicht so sehr an der Festplatte leidet, habe ich mir gedacht erst eine Datei in einem Container zwischenzuspeichern und den dann mit einem Mal zu schreiben.</p>
</blockquote>
<p>Vergiss es. Dein geliebtes Windows (bzw. die C++-Library) macht dies intern, schreibt in einen Buffer und wenn der genügend voll ist, schreibt es diesen auf die Festplatte.<br />
Die Performanz wird <strong>ganz sicher</strong> nicht an dem leiden, merklich besser wie es so ist, kann es gar nicht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975298</guid><dc:creator><![CDATA[Denksprinter]]></dc:creator><pubDate>Thu, 04 Nov 2010 18:50:48 GMT</pubDate></item><item><title><![CDATA[Reply to (Für mich) seltsames Verhalten on Thu, 04 Nov 2010 19:49:09 GMT]]></title><description><![CDATA[<p>Ich habs so jetzt mal abgeändert:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;

using namespace std;

void processFile(string const&amp; filename_in, string const&amp; filename_out) {
	cout &lt;&lt; filename_in &lt;&lt; endl;
	ifstream fs(filename_in);
	if (!fs) {
		cout &lt;&lt; &quot;Konnte &quot; &lt;&lt; filename_in &lt;&lt; &quot; nicht \x94 \bffnen!&quot; &lt;&lt; endl;
		return;
	}
	ofstream os(filename_out, ios::app);
	char buffer[1024];
	while (fs.getline(buffer,1024))	{
		os &lt;&lt; buffer &lt;&lt; endl;
		memset(buffer,0,sizeof(buffer));
	}
	fs.close();
	os.close();
}

int _tmain(int argc, _TCHAR* argv[]) {
	for (int i = 1; i &lt;= 38; ++i) {
		stringstream ss;
		ss &lt;&lt; i &lt;&lt; &quot;.txt&quot;;
		processFile(ss.str(), &quot;words.txt&quot;);
	}
	cout &lt;&lt; &quot;Fertig&quot; &lt;&lt; endl;
	cin.get();
	return 0;
}
</code></pre>
<p>Nur dauert es da <strong>10</strong> Minuten um 200 MB zu kopieren. Das ist etwas sehr langsam. Gibt es da irgendwelche Tricks, um das zu Beschleunigen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1975337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975337</guid><dc:creator><![CDATA[Denksportler]]></dc:creator><pubDate>Thu, 04 Nov 2010 19:49:09 GMT</pubDate></item><item><title><![CDATA[Reply to (Für mich) seltsames Verhalten on Thu, 04 Nov 2010 20:12:42 GMT]]></title><description><![CDATA[<p>Ich habs jetzt nicht getestet und ich kenne mich nicht aus, wie NTFS das intern macht (unter ext3 geht das sicher schneller), aber out zu öffnen dürfte etwas bringen:</p>
<pre><code class="language-cpp">using namespace std;

void processFile(string const&amp; filename_in, ofstream&amp; out) {
	cout &lt;&lt; filename_in &lt;&lt; endl;
	ifstream fs(filename_in);
	if (!fs) {
		cout &lt;&lt; &quot;Konnte &quot; &lt;&lt; filename_in &lt;&lt; &quot; nicht \x94 \bffnen!&quot; &lt;&lt; endl;
		return;
	}
	os &lt;&lt; fs.rdbuf();
	// fs.close(); braucht es nicht
}

int _tmain(int argc, _TCHAR* argv[]) {
	ofstream os(&quot;words.txt&quot;, ios::app);
	for (int i = 1; i &lt;= 38; ++i) {
		stringstream ss; ss &lt;&lt; i &lt;&lt; &quot;.txt&quot;;
		processFile(ss.str(), out);
	}
	os.close();
	cout &lt;&lt; &quot;Fertig&quot; &lt;&lt; endl;
	cin.get();
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1975366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975366</guid><dc:creator><![CDATA[Denksprinter]]></dc:creator><pubDate>Thu, 04 Nov 2010 20:12:42 GMT</pubDate></item><item><title><![CDATA[Reply to (Für mich) seltsames Verhalten on Thu, 04 Nov 2010 20:16:41 GMT]]></title><description><![CDATA[<p>Das werde ich mal ausprobieren.<br />
Aber nicht für jede Linie zu flushen hat auch schon einen erheblichen Geschwindigkeitsschub gegeben.</p>
<pre><code class="language-cpp">void processFile(string const&amp; filename_in, string const&amp; filename_out) {
	cout &lt;&lt; filename_in &lt;&lt; endl;
	ifstream fs(filename_in);
	if (!fs) {
		cout &lt;&lt; &quot;Konnte &quot; &lt;&lt; filename_in &lt;&lt; &quot; nicht \x94 \bffnen!&quot; &lt;&lt; endl;
		return;
	}
	ofstream os(filename_out, ios::app);
	char buffer[1024];
	while (fs.getline(buffer,1024))	{
		os &lt;&lt; buffer &lt;&lt; &quot;\n&quot;;
		memset(buffer,0,sizeof(buffer));
	}
	os.flush();
	fs.close();
	os.close();
}

int _tmain(int argc, _TCHAR* argv[]) {
	for (int i = 1; i &lt;= 38; ++i) {
		stringstream ss;
		ss &lt;&lt; i &lt;&lt; &quot;.txt&quot;;
		processFile(ss.str(), &quot;words.txt&quot;);
	}
	cout &lt;&lt; &quot;Fertig&quot; &lt;&lt; endl;
	cin.get();
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1975372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1975372</guid><dc:creator><![CDATA[Denksportler]]></dc:creator><pubDate>Thu, 04 Nov 2010 20:16:41 GMT</pubDate></item></channel></rss>