<?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[große Strings stückweise bearbeiten?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein kleines Problem. Ich arbeite gerade an einem kleinen persönlichem Projekt und möchte dafür eine txt Datei für weitere Bearbeitung aufbereiten, sprich Formatierungen durch einen normalen Zeilenumbruch ersetzen. Das klappt ja auch alles schön und gut, nur leider können diese (ursprünglichen) txt Dateien recht groß sein, so mehr als 5 MB. Mit meinem Code bekomme ich bis ca. einem halben MB eine annehmbare Laufzeit hin, aber alles darüber hinaus dauert halt viel zu lange.</p>
<p>Ich denke mal, dass es an der find Funktion liegt, die bei großen Strings einfach zu lange braucht (insbesondere, wenn man die Mehrfachsuche in dem String auch mehrfach braucht).</p>
<p>Jetzt hatte ich die Idee, dass es dann doch einfach die Laufzeit extrem reduzieren würde, wenn ich den String nur stückweise bearbeite. Nur wie mache ich das? Ich bin relativ neu mit C++ und weiß gerade nicht so recht weiter.</p>
<p>Ich gebe jetzt einfach mal den Beispielcode an, den ich bis jetzt schon selbst entwickelt habe. Um den Code erstmal einfach zu halten, habe ich bis jetzt noch keine eigenen Funktionen verwendet, obwohl es sich hier wahrscheinlich anbieten würde.</p>
<p>Ich wäre über jede Hilfe dankbar. Achja, ich möchte nicht unbedingt den kompletten Code von euch wissen, aber ein kleiner Denkanstoß würde schon sehr weiterhelfen. Danke <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">#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

int main()
{
	int i,j,k;
	std::string finden_umbruch,finden_tabulator,finden_doppelt_umbruch,finden_return;
	ifstream in_file(&quot;D:/Test.txt&quot;, ios::binary);

	if (!in_file.is_open()) return -1;

	in_file.seekg (0, ios::end);
	int length = in_file.tellg();
	in_file.seekg (0, ios::beg);

	std::string test;
	test.resize(length+1, '\0');

	in_file.read (&amp;(test[0]), length);

	finden_umbruch=&quot;\n&quot;;
	finden_tabulator=&quot;\t&quot;;
	finden_doppelt_umbruch=&quot;\n\n&quot;;
	finden_return=&quot;\r&quot;;

	string::size_type position = 0;

	while (position = test.find(finden_tabulator) != string::npos){
		i= test.find(finden_tabulator);
		if (i != -1)
			test.replace(i,1,finden_umbruch);
	}

	while (position = test.find(finden_return) != string::npos){
		j = test.find(finden_return);
		if (j != -1)
			test.replace(j,1,finden_umbruch);
	}

	while (position = test.find(finden_doppelt_umbruch) != string::npos){
		k = test.find(finden_doppelt_umbruch);
		if (k != -1)
			test.replace(k,2,finden_umbruch);	
	}

	ofstream testfile(&quot;D:/Testfile.txt&quot;, ios::out);
	testfile &lt;&lt; test;

	return 0;
}
</code></pre>
<p>Edit: Tippfehler raus <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/243795/große-strings-stückweise-bearbeiten</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 19:51:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243795.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Jun 2009 12:45:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to große Strings stückweise bearbeiten? on Sun, 21 Jun 2009 13:27:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein kleines Problem. Ich arbeite gerade an einem kleinen persönlichem Projekt und möchte dafür eine txt Datei für weitere Bearbeitung aufbereiten, sprich Formatierungen durch einen normalen Zeilenumbruch ersetzen. Das klappt ja auch alles schön und gut, nur leider können diese (ursprünglichen) txt Dateien recht groß sein, so mehr als 5 MB. Mit meinem Code bekomme ich bis ca. einem halben MB eine annehmbare Laufzeit hin, aber alles darüber hinaus dauert halt viel zu lange.</p>
<p>Ich denke mal, dass es an der find Funktion liegt, die bei großen Strings einfach zu lange braucht (insbesondere, wenn man die Mehrfachsuche in dem String auch mehrfach braucht).</p>
<p>Jetzt hatte ich die Idee, dass es dann doch einfach die Laufzeit extrem reduzieren würde, wenn ich den String nur stückweise bearbeite. Nur wie mache ich das? Ich bin relativ neu mit C++ und weiß gerade nicht so recht weiter.</p>
<p>Ich gebe jetzt einfach mal den Beispielcode an, den ich bis jetzt schon selbst entwickelt habe. Um den Code erstmal einfach zu halten, habe ich bis jetzt noch keine eigenen Funktionen verwendet, obwohl es sich hier wahrscheinlich anbieten würde.</p>
<p>Ich wäre über jede Hilfe dankbar. Achja, ich möchte nicht unbedingt den kompletten Code von euch wissen, aber ein kleiner Denkanstoß würde schon sehr weiterhelfen. Danke <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">#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

int main()
{
	int i,j,k;
	std::string finden_umbruch,finden_tabulator,finden_doppelt_umbruch,finden_return;
	ifstream in_file(&quot;D:/Test.txt&quot;, ios::binary);

	if (!in_file.is_open()) return -1;

	in_file.seekg (0, ios::end);
	int length = in_file.tellg();
	in_file.seekg (0, ios::beg);

	std::string test;
	test.resize(length+1, '\0');

	in_file.read (&amp;(test[0]), length);

	finden_umbruch=&quot;\n&quot;;
	finden_tabulator=&quot;\t&quot;;
	finden_doppelt_umbruch=&quot;\n\n&quot;;
	finden_return=&quot;\r&quot;;

	string::size_type position = 0;

	while (position = test.find(finden_tabulator) != string::npos){
		i= test.find(finden_tabulator);
		if (i != -1)
			test.replace(i,1,finden_umbruch);
	}

	while (position = test.find(finden_return) != string::npos){
		j = test.find(finden_return);
		if (j != -1)
			test.replace(j,1,finden_umbruch);
	}

	while (position = test.find(finden_doppelt_umbruch) != string::npos){
		k = test.find(finden_doppelt_umbruch);
		if (k != -1)
			test.replace(k,2,finden_umbruch);	
	}

	ofstream testfile(&quot;D:/Testfile.txt&quot;, ios::out);
	testfile &lt;&lt; test;

	return 0;
}
</code></pre>
<p>Edit: Tippfehler raus <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/1730461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730461</guid><dc:creator><![CDATA[Takhlahr]]></dc:creator><pubDate>Sun, 21 Jun 2009 13:27:48 GMT</pubDate></item><item><title><![CDATA[Reply to große Strings stückweise bearbeiten? on Sun, 21 Jun 2009 13:19:28 GMT]]></title><description><![CDATA[<p>Kleiner Tip von mir.<br />
Lies die Datei komplett ein, am besten in einen std::vector<a href="std::string" rel="nofollow">std::string</a> oder in eine std::queue<a href="std::string" rel="nofollow">std::string</a>.<br />
und auf dieser basis bearbeitest du dann deine strings innerhalb des programms und nicht innerhalb der datei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730488</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sun, 21 Jun 2009 13:19:28 GMT</pubDate></item><item><title><![CDATA[Reply to große Strings stückweise bearbeiten? on Sun, 21 Jun 2009 14:40:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15364">@Firefighter</a><br />
Er liest doch die Datei komplett in den Speicher ein.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21947">@Takhlahr</a><br />
Ich sehe da zwei Möglichkeiten für Geschwindigkeitsgewinn:<br />
1)<br />
Die Suche nach den zu ersetzenden Zeichen beginnt immer wieder von vor, das kostet Rechenzeit. Besser ist es, den String nur einmal zu durchlaufen.<br />
2)<br />
Einen weiteren Speedgewinn bekommst du, wenn du einen zweiten Stringpuffer spendierst; denn die Zeichenersetzung im selben String kostet ebenfalls viel Rechenzeit, weil ständig neu umkopiert werden muss.</p>
<p>Hier ein highspeed format0r, der Dateiinhalt ist bereits in <em>file_content</em> eingelesen, guckst du hier:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
#include &lt;string&gt; 
using namespace std; 

char* chars_to_replace = &quot;\t\r\n&quot;;
char replac0r = '\n';

bool is_char_to_be_replaced ( char c )
{
	char* a = chars_to_replace;
	while(*a)
		if ( *a++ == c )
			return true;
	return false;
}

int main() 
{ 
	string file_content = &quot;abc\tdef\r\nghi\n\njkl&quot;;
	string formated_file_content;
	const string::size_type len = file_content.size();
	string::size_type i = 0;

	while ( i &lt; len )
	{
		if ( is_char_to_be_replaced (file_content.at(i)))
		{
			i++;
			formated_file_content += replac0r;
			while (is_char_to_be_replaced (file_content.at(i)))
				{i++;}
		}
		else
		{
			formated_file_content += file_content.at(i);
			i++;
		}
	}

	cout &lt;&lt; &quot;original: &quot; &lt;&lt; endl;
	cout &lt;&lt; file_content &lt;&lt; endl;
	cout &lt;&lt; &quot;------&quot; &lt;&lt; endl;
	cout &lt;&lt; &quot;formated: &quot; &lt;&lt; endl;
	cout &lt;&lt; formated_file_content &lt;&lt; endl;
</code></pre>
<p>Gruß,<br />
B.B.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730532</guid><dc:creator><![CDATA[Big Brother]]></dc:creator><pubDate>Sun, 21 Jun 2009 14:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to große Strings stückweise bearbeiten? on Sun, 21 Jun 2009 14:49:49 GMT]]></title><description><![CDATA[<p>Kompilier mal im release mode mit optimierungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730538</guid><dc:creator><![CDATA[noch n tipp]]></dc:creator><pubDate>Sun, 21 Jun 2009 14:49:49 GMT</pubDate></item><item><title><![CDATA[Reply to große Strings stückweise bearbeiten? on Sun, 21 Jun 2009 15:15:24 GMT]]></title><description><![CDATA[<p>...und ersetz <code>at</code> durch <code>operator[]</code></p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730544</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 21 Jun 2009 15:15:24 GMT</pubDate></item><item><title><![CDATA[Reply to große Strings stückweise bearbeiten? on Sun, 21 Jun 2009 18:17:50 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>...und ersetz <code>at</code> durch <code>operator[]</code></p>
<p>bb</p>
</blockquote>
<p>Ja, das wird wahrscheinlich der Jahrhundert Performance Boost...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730664</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 21 Jun 2009 18:17:50 GMT</pubDate></item><item><title><![CDATA[Reply to große Strings stückweise bearbeiten? on Sun, 21 Jun 2009 18:54:53 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>...und ersetz <code>at</code> durch <code>operator[]</code></p>
<p>bb</p>
</blockquote>
<p>Ja, das wird wahrscheinlich der Jahrhundert Performance Boost...</p>
</blockquote>
<p>Es ist einfach mal unsinnig, in diesem Kontext at zu verwenden... Und da schon so was offensichtliches eigenartiges daran ist, hab ich mir die Zeit, alles durchzulesen, direkt gespart...<br />
beim überfliegen hab ich jedoch noch viele eigenarten gesehen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730681</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 21 Jun 2009 18:54:53 GMT</pubDate></item><item><title><![CDATA[Reply to große Strings stückweise bearbeiten? on Sun, 21 Jun 2009 18:56:58 GMT]]></title><description><![CDATA[<p>@Big Brother</p>
<p>Vielen Dank für deine doch recht ausführliche Antwort!<br />
Ich habe mir den Code mal genauer angeschaut und er macht tatsächlich das, was ich mir zuerst dachte, aber mangels ausreichender Kenntnisse nicht umsetzen konnte und mit meinen schwachen String-Operationen ersetzen musste.</p>
<p>Deine Lösung ist in der Tat um vieles eleganter und auch &quot;performanter&quot; als die meine. Ich denke, ich werde diese Lösung in ähnlicher Form durchaus verwenden können. Vielen Dank nochmal (auch an alle anderen)!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1730683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1730683</guid><dc:creator><![CDATA[Takhlahr]]></dc:creator><pubDate>Sun, 21 Jun 2009 18:56:58 GMT</pubDate></item></channel></rss>