<?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[Streams mit größeren Dateien]]></title><description><![CDATA[<p>Hallo erstmal,</p>
<p>ich hab mal wieder ein Problem. Ich habe ein einfaches Programm geschrieben, dass nach einer Zeile in einer Datei sucht und darüber dann einen Text aus einer anderen Datei schreibt, das ganze wird dann in einer dritten Datei (hier: new.txt) gespeichert.<br />
Das klappt soweit auch ganz prima, bei kleineren Dateien von ein paar Kilobytes zumindest. Nehme ich nun aber als erste Datei (die Datei in der gesucht wird und deren Text zusammen mit dem Eingefügten in die new.txt geschrieben wird) eine größere (habs mal mit ca. 400 kb versucht, das war schon zu viel, ich weiß nicht genau ab welcher Größe), dann werden ab einem bestimmten Punkt unendlich viele Leerzeilen eingefügt, sodass die new.txt, nachdem ich das Programm abbreche, größer ist als die Dateien mit dem Ausgangstext und dem Eingefügten zusammen.<br />
Das Komische ist, dass nicht etwa ab der eingefügten Stelle die Leerzeilen anfangen, sonst könnte es ein Fehler im Programm sein. Hier mein Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;windows.h&gt;

using namespace std;

int main()
{
cout&lt;&lt;&quot;Gebe hier die Datei an:\n&quot;;
string file;
cin&gt;&gt;file;

cout&lt;&lt;&quot;\n\nGebe nun die Datei mit dem Script an!\n&quot;;
string script;
cin&gt;&gt;script;

    fstream f;
    fstream h;

    fstream intof;
    intof.open(&quot;new.txt&quot;, ios::out);

    char cstring[256];
    char ofh[256];
    f.open(file.c_str(), ios::in);
    h.open(script.c_str(), ios::in);
    int once = 0;
    while (!f.eof())
    {
        f.getline(cstring, sizeof(cstring));
        string x = cstring;

        if (x == &quot;blablubb&quot;) {

              if (once == 0) {
                       intof&lt;&lt;endl;
              }

              while(!h.eof()) {
                  h.getline(ofh,sizeof(ofh));
                  string y = ofh;

//                  intof &lt;&lt; x &lt;&lt; endl;
                  intof &lt;&lt; y &lt;&lt; endl;

              }
              intof&lt;&lt;endl&lt;&lt;endl&lt;&lt;endl;
        }

        intof &lt;&lt; x &lt;&lt; endl;

    }
    f.close();
    intof.close();
    h.close();

    system(&quot;PAUSE&quot;);

}
</code></pre>
<p>Das geht bestimmt auch irgendwie kürzer, ist mir aber um ehrlich zu sein ziemlich egal.</p>
<p>Woher kommen diese Leerzeilen und wie schaffe ichs, dass sie nichtmehr auftauchen?</p>
<p>mfG Alemarius Nexus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187196/streams-mit-größeren-dateien</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 14:50:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187196.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Jul 2007 22:18:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Streams mit größeren Dateien on Mon, 16 Jul 2007 22:18:06 GMT]]></title><description><![CDATA[<p>Hallo erstmal,</p>
<p>ich hab mal wieder ein Problem. Ich habe ein einfaches Programm geschrieben, dass nach einer Zeile in einer Datei sucht und darüber dann einen Text aus einer anderen Datei schreibt, das ganze wird dann in einer dritten Datei (hier: new.txt) gespeichert.<br />
Das klappt soweit auch ganz prima, bei kleineren Dateien von ein paar Kilobytes zumindest. Nehme ich nun aber als erste Datei (die Datei in der gesucht wird und deren Text zusammen mit dem Eingefügten in die new.txt geschrieben wird) eine größere (habs mal mit ca. 400 kb versucht, das war schon zu viel, ich weiß nicht genau ab welcher Größe), dann werden ab einem bestimmten Punkt unendlich viele Leerzeilen eingefügt, sodass die new.txt, nachdem ich das Programm abbreche, größer ist als die Dateien mit dem Ausgangstext und dem Eingefügten zusammen.<br />
Das Komische ist, dass nicht etwa ab der eingefügten Stelle die Leerzeilen anfangen, sonst könnte es ein Fehler im Programm sein. Hier mein Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;windows.h&gt;

using namespace std;

int main()
{
cout&lt;&lt;&quot;Gebe hier die Datei an:\n&quot;;
string file;
cin&gt;&gt;file;

cout&lt;&lt;&quot;\n\nGebe nun die Datei mit dem Script an!\n&quot;;
string script;
cin&gt;&gt;script;

    fstream f;
    fstream h;

    fstream intof;
    intof.open(&quot;new.txt&quot;, ios::out);

    char cstring[256];
    char ofh[256];
    f.open(file.c_str(), ios::in);
    h.open(script.c_str(), ios::in);
    int once = 0;
    while (!f.eof())
    {
        f.getline(cstring, sizeof(cstring));
        string x = cstring;

        if (x == &quot;blablubb&quot;) {

              if (once == 0) {
                       intof&lt;&lt;endl;
              }

              while(!h.eof()) {
                  h.getline(ofh,sizeof(ofh));
                  string y = ofh;

//                  intof &lt;&lt; x &lt;&lt; endl;
                  intof &lt;&lt; y &lt;&lt; endl;

              }
              intof&lt;&lt;endl&lt;&lt;endl&lt;&lt;endl;
        }

        intof &lt;&lt; x &lt;&lt; endl;

    }
    f.close();
    intof.close();
    h.close();

    system(&quot;PAUSE&quot;);

}
</code></pre>
<p>Das geht bestimmt auch irgendwie kürzer, ist mir aber um ehrlich zu sein ziemlich egal.</p>
<p>Woher kommen diese Leerzeilen und wie schaffe ichs, dass sie nichtmehr auftauchen?</p>
<p>mfG Alemarius Nexus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326848</guid><dc:creator><![CDATA[Alemarius Nexus]]></dc:creator><pubDate>Mon, 16 Jul 2007 22:18:06 GMT</pubDate></item><item><title><![CDATA[Reply to Streams mit größeren Dateien on Mon, 16 Jul 2007 22:25:20 GMT]]></title><description><![CDATA[<p>das der Code jemals funktioniert grenzt an einem wunder...</p>
<p>Erklär mal mit einem Beispiel was du genau machen willst ... dein Code ist einfach unübersichtlich und was glaubst du was sizeof(array) dir zurück gibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326849</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Mon, 16 Jul 2007 22:25:20 GMT</pubDate></item><item><title><![CDATA[Reply to Streams mit größeren Dateien on Mon, 16 Jul 2007 22:50:30 GMT]]></title><description><![CDATA[<blockquote>
<p>was glaubst du was sizeof(array) dir zurück gibt?</p>
</blockquote>
<p>Das weiß ich nicht, muss ich zugeben. den Code für die Streams hab ich aus dem Internet übernommen und weil er funktioniert hat, hab ich mir darüber eigentlich keine Gedanken gemacht (nein, ich habe NICHT das ganze Programm übernommen). Aber soweit ich weiß, gibt einem das die Größe aller Arrayelemente zusammen zurück.<br />
Aber weil das ja bisher und auch hier mit kleineren Dateien geklappt hat, müsste das ja gehen.</p>
<p>Das Programm öffnet zwei eingegebene Dateien zum Lesen (die, in der der Grundtext steht und die mit dem, was zwischen den Grundtext eingefügt werden soll) und eine zum Schreiben (hier: new.txt, dort wird dann der Grundtext und das Eingefügte reingeschrieben). Dann wird der Grundtext solange in die new.txt geschrieben, bis der Text 'blablubb' gefunden wurde. Dann wird erstmal über diese Zeile mit 'blablubb' das Einzufügende aus der zweiten Datei geschrieben, danach wird der Grundtext weiter abgerattert. Ein Beispiel:</p>
<p>Grundtextdatei (erste Datei):</p>
<p>Ich<br />
sage<br />
blablubb<br />
und so weiter<br />
und so fort</p>
<p>Einzufügendes (zweite Datei):</p>
<p>nicht</p>
<p>am Ende steht in der new.txt (dritte Datei) also folgendes:</p>
<p>Ich<br />
sage<br />
nicht<br />
blablubb<br />
und so weiter<br />
und so fort</p>
<p>(ein bescheuertes Beispiel, ich weiß, aber ich musste erstmal einen logischen Text finden, der auf den Suchtext 'blablubb' passt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326856</guid><dc:creator><![CDATA[Alemarius Nexus]]></dc:creator><pubDate>Mon, 16 Jul 2007 22:50:30 GMT</pubDate></item><item><title><![CDATA[Reply to Streams mit größeren Dateien on Tue, 17 Jul 2007 06:34:40 GMT]]></title><description><![CDATA[<p>Alemarius Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int once = 0;
/*  while (!f.eof())
    {
        f.getline(cstring, sizeof(cstring));
        string x = cstring;
        
        if (x == &quot;blablubb&quot;) {
              
              */
              if (once == 0) {
                       intof&lt;&lt;endl;
              }
</code></pre>
</blockquote>
<p>Was für ein Sinn macht denn ein int once = 0 und die anschließende if Bedingung if(once ==0)?<br />
Du initialisierst once ein mal mit 0 und das wars.<br />
Also unnötig diese Abfrage auch wenn ich nicht nachvollziehen kann was du überhaupt mit once anstellen möchtest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326928</guid><dc:creator><![CDATA[Brok3r]]></dc:creator><pubDate>Tue, 17 Jul 2007 06:34:40 GMT</pubDate></item><item><title><![CDATA[Reply to Streams mit größeren Dateien on Tue, 17 Jul 2007 07:57:49 GMT]]></title><description><![CDATA[<p>Wirf erstmal die char-Arrays raus und nimm statt dessen string. Das dürfte ein Gutteil deiner Probleme beheben.<br />
Wegen once, das sollte wohl eher so aussehen.</p>
<pre><code class="language-cpp">if (once == 0) 
{
   intof&lt;&lt;endl;
   once = 1;
}
</code></pre>
<p>Deine wechselnden Einrückungen sowie die vielen Leerzeilen im Code machen den nicht wirklich lesbarer. <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/1326983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326983</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 17 Jul 2007 07:57:49 GMT</pubDate></item><item><title><![CDATA[Reply to Streams mit größeren Dateien on Tue, 17 Jul 2007 08:49:35 GMT]]></title><description><![CDATA[<p>Nja ... woher weiß du denn an welche Stelle der String soll?</p>
<pre><code class="language-cpp">bool file_merge_content(const std::string&amp; file_merge, const std::string&amp; file_source, const std::streamsize&amp; pos, const std::string&amp; file_dest)
{
	std::fstream file_stream(file_source.c_str(), std::ios::in);
	if (!file_stream)
		return false;
	/* Einzufügenden Text aus Datei auslesen */
	std::string insert_total;
	std::string temp_line;
	while (std::getline(file_stream, temp_line))
		insert_total += (temp_line + '\n');

	file_stream.close();
	file_stream.clear();

	file_stream.open(file_merge.c_str(), std::ios::in);
	if (!file_stream)
		return false;

	/* Zeilenweise einlesen. Wenn wir an der Stelle sind wo du es eingefügt haben willst, erst einfügen. */
	std::string final_content;
	for (std::streamsize line = 0; std::getline(file_stream, temp_line); ++line)
	{
		if (line == pos)
			final_content += insert_total;
		final_content += (temp_line + '\n');
	}

	file_stream.close();
	file_stream.clear();

	/* Unseren zusammengesetzten Inhalt wieder in eine Datei packen. */
	file_stream.open(file_dest.c_str(), std::ios::out);
	if (!file_stream)
		return false;

	file_stream &lt;&lt; final_content &lt;&lt; std::endl;
	return true;
}
</code></pre>
<p>wäre wohl eine saubere Lösung <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>
<p><strong>EDIT</strong><br />
Erklärung hinzugefügt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327021</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 17 Jul 2007 08:49:35 GMT</pubDate></item><item><title><![CDATA[Reply to Streams mit größeren Dateien on Tue, 17 Jul 2007 10:35:32 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Wirf erstmal die char-Arrays raus und nimm statt dessen string. Das dürfte ein Gutteil deiner Probleme beheben.</p>
</blockquote>
<p>das würde ich auch empfehlen. Ich kann aber in obigen Code keinen Fehler feststellen, der zum beschriebenen Verhalten führt.</p>
<p>@Alemarius: versuch' es mal hiermit und berichte von Deinen Erfahrungen.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;   // .. fehlte
#include &lt;windows.h&gt;

using namespace std;

int main()
{
    cout&lt;&lt;&quot;Gebe hier die Datei an:\n&quot;;
    string file;
    cin&gt;&gt;file;

    cout&lt;&lt;&quot;\n\nGebe nun die Datei mit dem Script an!\n&quot;;
    string script;
    cin&gt;&gt;script;

    ofstream intof( &quot;new.txt&quot; );
    ifstream f( file.c_str() );
    for( string x; getline( f, x ); )
    {
        if (x == &quot;blablubb&quot;) {
            intof&lt;&lt;endl;
            // hier jetzt Inhalt aus 'script' einfügen
            ifstream h( script.c_str() );
            intof &lt;&lt; h.rdbuf();

            intof &lt;&lt; endl &lt;&lt; endl &lt;&lt; endl;  // + 3 Leerzeilen
        }
        intof &lt;&lt; x &lt;&lt; endl;
    }
    system(&quot;PAUSE&quot;);
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327113</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 17 Jul 2007 10:35:32 GMT</pubDate></item><item><title><![CDATA[Reply to Streams mit größeren Dateien on Tue, 17 Jul 2007 12:16:21 GMT]]></title><description><![CDATA[<p>@ (D)Evil:</p>
<p>Hab ich jetzt nicht benutzt, weil Werners kürzer ist, trotzdem danke.</p>
<blockquote>
<p>Was für ein Sinn macht denn ein int once = 0 und die anschließende if Bedingung if(once ==0)?<br />
Du initialisierst once ein mal mit 0 und das wars.</p>
</blockquote>
<p>Huch, hab ganz vergessen once danach zu 1 zu machen, ich hab den Code mehrmals geändert, deshalb macht es jetzt bei genauer Betrachtung garkeinen Sinn mehr. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a> Salomon:</p>
<p>Ich hab jetzt deine Variante genommen, danke dafür.</p>
<p>Klappt jetzt wunderbar, und wieder mal danke an alle <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327212</guid><dc:creator><![CDATA[Alemarius Nexus]]></dc:creator><pubDate>Tue, 17 Jul 2007 12:16:21 GMT</pubDate></item></channel></rss>