<?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[ofstream und starke Speicherbelegung]]></title><description><![CDATA[<p>Hallo, ich ein Programm geschrieben das mir die Ordnerstruktur eines Verzeichnisses ausliest. Die Pfade der Ordner und Unterordner speichere ich in einer Liste und lese dann alle Dateien in einem Ordner und schreibe die Dateien dann direkt in eine datei weg.</p>
<p>Das funktioniert soweit wunderbar. Wenn ich aber mal einen Ornder wie &quot;Programme&quot; mit seinen tausenden von Unterordnern auslese und dann diese Methode hier aufrufe nimmt sich das programm immer mehr speicher.</p>
<p>das geht dann sogar soweit, dass der ram nicht mehr reicht(ich habe 1GB Ram) und windows-anfangen muss dateien auszulagern. wie kann ich dieses extrem speicherfressende laufzeit verhalten abstellen?</p>
<p>hier mal der code der besagte methode</p>
<pre><code class="language-cpp">// Liest die Dateien in einem Ordner und schreibt diese direkt Weg.

bool FileManager::readFiles_WriteToFile(std::list&lt;std::wstring&gt; directoryList, std::wstring filePath)

{

	//Prüfen ob es Ausgabedatei schon gibt

	std::ifstream openTest(filePath.c_str());

	if (openTest)

		return false;

	//Ausgabedatei eröffnen

	std::ofstream outfile(filePath.c_str(), std::ios::binary | std::ios::out);

	std::list&lt;std::wstring&gt;::iterator it;

	for (it = directoryList.begin(); it != directoryList.end(); it++)

	{

		WIN32_FIND_DATA fd;

		TCHAR szDir[MAX_PATH];

		HANDLE hFind;

		//Pfad mit Wildcard ergänzen

		StringCchCopy(szDir, MAX_PATH, it-&gt;c_str());

		StringCchCat(szDir, MAX_PATH, TEXT(&quot;\\*&quot;));	

		//erste Datei lesen '.'

		hFind = FindFirstFile(szDir, &amp;fd);

		if (hFind == INVALID_HANDLE_VALUE)

			return false;

		else

		{

			//zweite Datei lesen '..'

			FindNextFile(hFind, &amp;fd);

			//Ab jetzt echte Dateien, solange lesen bis Verzeichnis durchgelesen wurde

			while (FindNextFile(hFind, &amp;fd) != 0)

			{

				//Ordner und versteckte Dateien nicht ausgeben

				if (fd.dwFileAttributes &amp; (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_HIDDEN))

					continue;

				//li.push_back(std::wstring(fd.cFileName));

				FileInfo x(getFileNameWithoutFileType(std::wstring(fd.cFileName),true),

					       extractFileType(std::wstring(fd.cFileName),true),

						   removeSpecialCharacter(readTitelOfFileEx(std::wstring(it-&gt;c_str()), std::wstring(fd.cFileName))),

						   std::wstring(std::wstring(it-&gt;c_str())+= L&quot;\\&quot; + std::wstring(fd.cFileName)));

				outfile&lt;&lt;x.convertWStringToString(x.getFilePath()).c_str()&lt;&lt;&quot;;&quot;

						&lt;&lt;x.convertWStringToString(x.getFileName()).c_str()&lt;&lt;&quot;;&quot;

						&lt;&lt;x.convertWStringToString(x.getTitelText()).c_str()&lt;&lt;&quot;;&quot;

						&lt;&lt;x.convertWStringToString(x.getDocTyp()).c_str()&lt;&lt;&quot;;\n&quot;;

			}

			//Handle schließen

			FindClose(hFind);

		}

	}

	return true;

}
</code></pre>
<p>Das Objekt FileInfo ist ein Objekt das mir eine Methode bereitstellt um von Wide-char auf multibyte zu konvertieren</p>
<pre><code class="language-cpp">FileInfo::FileInfo(std::wstring name, std::wstring typ, std::wstring titel, std::wstring path):

									m_fileName(name), m_docTyp(typ), m_titelText(titel), m_filePath(path)

{

}
</code></pre>
<pre><code class="language-cpp">std::string FileInfo::convertWStringToString(std::wstring in)

{

		 char charArr[1024]={0};

		 WideCharToMultiByte(CP_ACP,

							 NULL,

							 in.c_str(),

							 static_cast&lt;int&gt;(in.length()),

							 charArr,

							 static_cast&lt;int&gt;(in.length()),

							 NULL,

							 NULL);

		 return std::string(charArr);

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/211483/ofstream-und-starke-speicherbelegung</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 05:24:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/211483.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Apr 2008 17:28:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ofstream und starke Speicherbelegung on Wed, 23 Apr 2008 17:28:40 GMT]]></title><description><![CDATA[<p>Hallo, ich ein Programm geschrieben das mir die Ordnerstruktur eines Verzeichnisses ausliest. Die Pfade der Ordner und Unterordner speichere ich in einer Liste und lese dann alle Dateien in einem Ordner und schreibe die Dateien dann direkt in eine datei weg.</p>
<p>Das funktioniert soweit wunderbar. Wenn ich aber mal einen Ornder wie &quot;Programme&quot; mit seinen tausenden von Unterordnern auslese und dann diese Methode hier aufrufe nimmt sich das programm immer mehr speicher.</p>
<p>das geht dann sogar soweit, dass der ram nicht mehr reicht(ich habe 1GB Ram) und windows-anfangen muss dateien auszulagern. wie kann ich dieses extrem speicherfressende laufzeit verhalten abstellen?</p>
<p>hier mal der code der besagte methode</p>
<pre><code class="language-cpp">// Liest die Dateien in einem Ordner und schreibt diese direkt Weg.

bool FileManager::readFiles_WriteToFile(std::list&lt;std::wstring&gt; directoryList, std::wstring filePath)

{

	//Prüfen ob es Ausgabedatei schon gibt

	std::ifstream openTest(filePath.c_str());

	if (openTest)

		return false;

	//Ausgabedatei eröffnen

	std::ofstream outfile(filePath.c_str(), std::ios::binary | std::ios::out);

	std::list&lt;std::wstring&gt;::iterator it;

	for (it = directoryList.begin(); it != directoryList.end(); it++)

	{

		WIN32_FIND_DATA fd;

		TCHAR szDir[MAX_PATH];

		HANDLE hFind;

		//Pfad mit Wildcard ergänzen

		StringCchCopy(szDir, MAX_PATH, it-&gt;c_str());

		StringCchCat(szDir, MAX_PATH, TEXT(&quot;\\*&quot;));	

		//erste Datei lesen '.'

		hFind = FindFirstFile(szDir, &amp;fd);

		if (hFind == INVALID_HANDLE_VALUE)

			return false;

		else

		{

			//zweite Datei lesen '..'

			FindNextFile(hFind, &amp;fd);

			//Ab jetzt echte Dateien, solange lesen bis Verzeichnis durchgelesen wurde

			while (FindNextFile(hFind, &amp;fd) != 0)

			{

				//Ordner und versteckte Dateien nicht ausgeben

				if (fd.dwFileAttributes &amp; (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_HIDDEN))

					continue;

				//li.push_back(std::wstring(fd.cFileName));

				FileInfo x(getFileNameWithoutFileType(std::wstring(fd.cFileName),true),

					       extractFileType(std::wstring(fd.cFileName),true),

						   removeSpecialCharacter(readTitelOfFileEx(std::wstring(it-&gt;c_str()), std::wstring(fd.cFileName))),

						   std::wstring(std::wstring(it-&gt;c_str())+= L&quot;\\&quot; + std::wstring(fd.cFileName)));

				outfile&lt;&lt;x.convertWStringToString(x.getFilePath()).c_str()&lt;&lt;&quot;;&quot;

						&lt;&lt;x.convertWStringToString(x.getFileName()).c_str()&lt;&lt;&quot;;&quot;

						&lt;&lt;x.convertWStringToString(x.getTitelText()).c_str()&lt;&lt;&quot;;&quot;

						&lt;&lt;x.convertWStringToString(x.getDocTyp()).c_str()&lt;&lt;&quot;;\n&quot;;

			}

			//Handle schließen

			FindClose(hFind);

		}

	}

	return true;

}
</code></pre>
<p>Das Objekt FileInfo ist ein Objekt das mir eine Methode bereitstellt um von Wide-char auf multibyte zu konvertieren</p>
<pre><code class="language-cpp">FileInfo::FileInfo(std::wstring name, std::wstring typ, std::wstring titel, std::wstring path):

									m_fileName(name), m_docTyp(typ), m_titelText(titel), m_filePath(path)

{

}
</code></pre>
<pre><code class="language-cpp">std::string FileInfo::convertWStringToString(std::wstring in)

{

		 char charArr[1024]={0};

		 WideCharToMultiByte(CP_ACP,

							 NULL,

							 in.c_str(),

							 static_cast&lt;int&gt;(in.length()),

							 charArr,

							 static_cast&lt;int&gt;(in.length()),

							 NULL,

							 NULL);

		 return std::string(charArr);

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1497060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1497060</guid><dc:creator><![CDATA[laks]]></dc:creator><pubDate>Wed, 23 Apr 2008 17:28:40 GMT</pubDate></item><item><title><![CDATA[Reply to ofstream und starke Speicherbelegung on Thu, 24 Apr 2008 11:34:10 GMT]]></title><description><![CDATA[<p>keiner eine Idee ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1497389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1497389</guid><dc:creator><![CDATA[laks]]></dc:creator><pubDate>Thu, 24 Apr 2008 11:34:10 GMT</pubDate></item><item><title><![CDATA[Reply to ofstream und starke Speicherbelegung on Fri, 25 Apr 2008 18:52:04 GMT]]></title><description><![CDATA[<p>Wenn man Probleme mit dem Speicherplatz hat, dann hilft seit altersher eine Datei auf der Festplatte!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1498250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498250</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Fri, 25 Apr 2008 18:52:04 GMT</pubDate></item><item><title><![CDATA[Reply to ofstream und starke Speicherbelegung on Sat, 26 Apr 2008 15:29:51 GMT]]></title><description><![CDATA[<p>mein problem ist ja grade das wegschreiben in eine datei!</p>
<p>während des wegschreiben nimmt sich das programm immer mehr speicher. wenn die liste im speicher erstellt ist, sind grade mal 3-4MB belegt, das ist absolut ok.</p>
<p>nur wenn er anfängt weg zuschreiben belegt er immer mehr speicher. der speicher wird zudem auch erst wieder freigegeben, wenn man das programm beendet.</p>
<p>deswegen versteh ich das halt nicht was ich falsch mache. ich arbeite zudem auch nur auf dem stack und nicht auf dem heap, von daher sollte sich der speicher ja selbst weider freigeben.(was ja auch passiert, halt erst beim programm beenden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1498584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498584</guid><dc:creator><![CDATA[laks]]></dc:creator><pubDate>Sat, 26 Apr 2008 15:29:51 GMT</pubDate></item><item><title><![CDATA[Reply to ofstream und starke Speicherbelegung on Mon, 28 Apr 2008 17:43:43 GMT]]></title><description><![CDATA[<p>Ich bin zu faul, Deinen Sourcecode auf mögliche Fehler zu durchsuchen. Der Stack ist eigentlich dafür da, kleine Datenmengen zwischen Funktionen auszutauschen. Was draufgelegt wird, muss auch wieder abgeräumt werden. Dateien lesen und schreiben beansprucht wenig Speicherplatz auf dem Heap.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499880</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Mon, 28 Apr 2008 17:43:43 GMT</pubDate></item><item><title><![CDATA[Reply to ofstream und starke Speicherbelegung on Mon, 28 Apr 2008 19:31:56 GMT]]></title><description><![CDATA[<p>Tu doch einfach mal Schritt für Schritt Sachen auskommentieren und ausprobieren. Wenn du dann siehst dass wenn du Zeile X auskommentierst der Speicherverbrauch &quot;normal&quot; wird hast du den Untäter gefunden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1500002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1500002</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 28 Apr 2008 19:31:56 GMT</pubDate></item></channel></rss>