<?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[Datei öffnen und Zeilen verschieben]]></title><description><![CDATA[<p>Morgen zusammen,</p>
<p>Ich möchte gerne ein File einlesen und falls &quot;MWR154=&quot; vorkommt, soll<br />
es in die zweite Zeile der selben Datei verschoben werden. Falls das gesuchte an einer anderen Stelle nochmals vorkommt, soll er diese dann nach Zeile 3 verschieben.</p>
<p>Bsp.</p>
<blockquote>
<p>Das<br />
ist<br />
ein<br />
Beispiel<br />
MWR154=30<br />
Weiter<br />
MWR154=34</p>
</blockquote>
<p>Output</p>
<blockquote>
<p>Das<br />
MWR154=30<br />
MWR154=34<br />
ist<br />
ein<br />
Beispiel<br />
Weiter</p>
</blockquote>
<p>Soweit bin ich bis Dato:</p>
<pre><code class="language-cpp">int main(int argc, char *argv[])
{
    ifstream f;  // Datei-Handle

	f.open(argv[1], ios::in); // Öffne Datei aus Parameter
    int i=0;
	while (!f.eof())          // Solange noch Daten vorliegen
    {
        getline(f, s);        // Lese eine Zeile
		Zeile[i]=s;
		i++;
	}

	for (k=0; k&lt;i; k++)

	{	string::size_type loc1 = Zeile[k].find( &quot;MWR154=&quot;, 0 );
			if( loc1 != string::npos ) 
			{			
						!!!! HELP !!!!

			}
			else
			{
			}

		}

    f.close();                // Datei wieder schließen

 return 1;
 }
</code></pre>
<p>Wie kann ich die Zeile nun auschneiden und wieder einfügen? Stelle Quellcode --&gt; !!!!HELP!!!!..</p>
<p>Geht dies überhaupt mit ifstream ? Blicke hier nicht so ganz durch und würde mich über Vorschläge/Verbesserungstipps freuen...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284021/datei-öffnen-und-zeilen-verschieben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 08:32:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284021.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 Mar 2011 07:26:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datei öffnen und Zeilen verschieben on Thu, 24 Mar 2011 07:26:36 GMT]]></title><description><![CDATA[<p>Morgen zusammen,</p>
<p>Ich möchte gerne ein File einlesen und falls &quot;MWR154=&quot; vorkommt, soll<br />
es in die zweite Zeile der selben Datei verschoben werden. Falls das gesuchte an einer anderen Stelle nochmals vorkommt, soll er diese dann nach Zeile 3 verschieben.</p>
<p>Bsp.</p>
<blockquote>
<p>Das<br />
ist<br />
ein<br />
Beispiel<br />
MWR154=30<br />
Weiter<br />
MWR154=34</p>
</blockquote>
<p>Output</p>
<blockquote>
<p>Das<br />
MWR154=30<br />
MWR154=34<br />
ist<br />
ein<br />
Beispiel<br />
Weiter</p>
</blockquote>
<p>Soweit bin ich bis Dato:</p>
<pre><code class="language-cpp">int main(int argc, char *argv[])
{
    ifstream f;  // Datei-Handle

	f.open(argv[1], ios::in); // Öffne Datei aus Parameter
    int i=0;
	while (!f.eof())          // Solange noch Daten vorliegen
    {
        getline(f, s);        // Lese eine Zeile
		Zeile[i]=s;
		i++;
	}

	for (k=0; k&lt;i; k++)

	{	string::size_type loc1 = Zeile[k].find( &quot;MWR154=&quot;, 0 );
			if( loc1 != string::npos ) 
			{			
						!!!! HELP !!!!

			}
			else
			{
			}

		}

    f.close();                // Datei wieder schließen

 return 1;
 }
</code></pre>
<p>Wie kann ich die Zeile nun auschneiden und wieder einfügen? Stelle Quellcode --&gt; !!!!HELP!!!!..</p>
<p>Geht dies überhaupt mit ifstream ? Blicke hier nicht so ganz durch und würde mich über Vorschläge/Verbesserungstipps freuen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039170</guid><dc:creator><![CDATA[Luftikus]]></dc:creator><pubDate>Thu, 24 Mar 2011 07:26:36 GMT</pubDate></item><item><title><![CDATA[Reply to Datei öffnen und Zeilen verschieben on Thu, 24 Mar 2011 07:29:41 GMT]]></title><description><![CDATA[<p>Einfach zu verschieben ist wahrscheinlich nicht so einfach. Der Ablauf sollte sein:</p>
<p>(a) Zeilenweise einlesen (abspeichern bspw. in list&lt;string&gt;)<br />
(b) Alle Einträge mit &quot;MWR154=&quot; am Start suchen und in der Liste verschieben (Wahrscheinlich mit einer Kombination aus list.remove und list.insert)<br />
(c) Zeilenweise die Datei neu schreiben</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039173</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Thu, 24 Mar 2011 07:29:41 GMT</pubDate></item><item><title><![CDATA[Reply to Datei öffnen und Zeilen verschieben on Thu, 24 Mar 2011 08:45:07 GMT]]></title><description><![CDATA[<p>SideWinder schrieb:</p>
<blockquote>
<p>Einfach zu verschieben ist wahrscheinlich nicht so einfach. Der Ablauf sollte sein:</p>
<p>(a) Zeilenweise einlesen (abspeichern bspw. in list&lt;string&gt;)<br />
(b) Alle Einträge mit &quot;MWR154=&quot; am Start suchen und in der Liste verschieben (Wahrscheinlich mit einer Kombination aus list.remove und list.insert)<br />
(c) Zeilenweise die Datei neu schreiben</p>
<p>MfG SideWinder</p>
</blockquote>
<p>Ich würde eine zweite Datei aufmachen, und von der ersten entsprechend kopieren. Wenn alles gut gelaufen ist, dann löscht Du die original Datei und bennenst die neue entsprechend um. Wenn was schief geht, bleibt die original Datei erhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039204</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 24 Mar 2011 08:45:07 GMT</pubDate></item><item><title><![CDATA[Reply to Datei öffnen und Zeilen verschieben on Thu, 24 Mar 2011 09:31:42 GMT]]></title><description><![CDATA[<p>Ich stimme Tachyon zu - in einer Datei in-place herumzufuhrwerken, ist immer gefährlich (was passiert bei Stromausfall?).</p>
<p>Was den Algorithmus angeht: Ich denke, es wäre einfacher, die verschiedenen Zeilentypen gleich beim Einlesen in verschiedene Container zu sortieren. Ich stelle mir das etwa so vor:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;cstdio&gt;
#include &lt;deque&gt;
#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;stdexcept&gt;
#include &lt;string&gt;

#ifdef _WIN32
#  define NOMINMAX
#  include &lt;windows.h&gt;
#else
#  include &lt;unistd.h&gt;
#endif

void enforce(bool condition, std::string const &amp;message) {
  if(!condition) throw std::runtime_error(message);
}

int main() {
  std::string first_line;
  std::deque&lt;std::string&gt; lines_mwr;
  std::deque&lt;std::string&gt; lines_other;

  char const *const filename_in  = &quot;datei.txt&quot;;

  {
    std::ifstream in(filename_in);
    std::string line;

    enforce(std::getline(in, first_line), &quot;Fehler beim Lesen der Eingabedatei&quot;);

    while(std::getline(in, line)) {
      if(line.compare(0, 7, &quot;MWR154=&quot;) == 0) {
        lines_mwr  .push_back(line);
      } else {
        lines_other.push_back(line);
      }
    }
  }

  char filename_tmp[L_tmpnam];

  {
    // In Produktionscode evtl. besser auf tmpfile() zurückgreifen. Das ist zwar C,
    // schließt aber eine Race-Condition aus.
    enforce(std::tmpnam(filename_tmp) != 0, &quot;Temporärer Dateiname konnte nicht generiert werden&quot;);

    std::ofstream out(filename_tmp);

    enforce(out, &quot;Temporäre Datei konnte nicht erstellt werden&quot;);

    out &lt;&lt; first_line &lt;&lt; '\n';
    std::copy(lines_mwr  .begin(), lines_mwr  .end(), std::ostream_iterator&lt;std::string&gt;(out, &quot;\n&quot;));
    std::copy(lines_other.begin(), lines_other.end(), std::ostream_iterator&lt;std::string&gt;(out, &quot;\n&quot;));
  }

#ifdef _WIN32
  MoveFileEx(filename_tmp, filename_in, MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH);
#else
  rename    (filename_tmp, filename_in);
#endif
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2039252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039252</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 24 Mar 2011 09:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to Datei öffnen und Zeilen verschieben on Thu, 24 Mar 2011 21:57:37 GMT]]></title><description><![CDATA[<p>Luftikus schrieb:</p>
<blockquote>
<p>Ich möchte gerne ein File einlesen und falls &quot;MWR154=&quot; vorkommt, soll<br />
es in die zweite Zeile der selben Datei verschoben werden. Falls das gesuchte an einer anderen Stelle nochmals vorkommt, soll er diese dann nach Zeile 3 verschieben.</p>
</blockquote>
<p>Alles einlesen sortieren und wieder ausgeben - ist aber jeden Fall die richtige Vorgehesweise. Und beim Sortieren erledigt <a href="http://www.cplusplus.com/reference/algorithm/stable_sort/" rel="nofollow">std::stable_sort</a> schon alles für Dich.</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt; // stable_sort, copy
#include &lt;fstream&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt; // ostream_iterator
#include &lt;string&gt;
#include &lt;vector&gt;

struct compareStr
{
    explicit compareStr( const std::string&amp; prefix ) : m_prefix( prefix ) {}
    bool operator()( const std::string&amp; a, const std::string&amp; b ) const
    {   // 'a' ist genau dann &quot;kleiner&quot; als 'b', falls a das prefix enthält und b nicht.
        return a.substr( 0, m_prefix.size() ) == m_prefix
            &amp;&amp; b.substr( 0, m_prefix.size() ) != m_prefix;
    }
private:
    std::string m_prefix;
};

int main( int argc, char* argv[] )
{
    using namespace std; 
    if( argc &lt; 2 )
    {
        cerr &lt;&lt; &quot;Bitte Dateinamen angeben&quot; &lt;&lt; endl;
        return -1;
    }
    vector&lt; string &gt; lines;
    {   // vector 'lines' aus Datei füllen
        ifstream datei(argv[1]);
        if( !datei.is_open() )
        {
            cerr &lt;&lt; &quot;Datei '&quot; &lt;&lt; argv[1] &lt;&lt; &quot;' nicht gefunden&quot; &lt;&lt; endl;
            return -1;
        }
        for( string line; getline( datei, line ); )
            lines.push_back( line );
    }
    if( lines.size() &gt; 1 ) // Bem.: erst ab der zweiten Zeile sortieren
        stable_sort( ++lines.begin(), lines.end(), compareStr(&quot;MWR154=&quot;) );
    {   // sortierte Zeilen wieder wegschreiben
        ofstream datei(argv[1]);
        copy( lines.begin(), lines.end(), ostream_iterator&lt; string &gt;( datei, &quot;\n&quot; ) );
    }
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039648</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 24 Mar 2011 21:57:37 GMT</pubDate></item><item><title><![CDATA[Reply to Datei öffnen und Zeilen verschieben on Fri, 25 Mar 2011 05:55:48 GMT]]></title><description><![CDATA[<p>Danke für die guten Vorschläge...Habe mich heute früh mal Werner seiner<br />
guten Lösung gewidmet. Funktioniert super...Nur zum Verständnis, was ist wenn er die Zeilen an Stelle 3 der Datei schreiben soll ?</p>
<p>Das ändern der If-Bedingung von 2 auf 3, bringt nicht den gewünschten Erfolg :</p>
<pre><code class="language-cpp">if( lines.size() &gt; 2 )
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2039691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039691</guid><dc:creator><![CDATA[Luftikus]]></dc:creator><pubDate>Fri, 25 Mar 2011 05:55:48 GMT</pubDate></item><item><title><![CDATA[Reply to Datei öffnen und Zeilen verschieben on Fri, 25 Mar 2011 06:39:53 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if( lines.size() &gt; 2 )
   stable_sort( lines.begin() + 2, lines.end(), compareStr(&quot;MWR154=&quot;) );
</code></pre>
<p>Klappt so aber nur, wenn nicht vorher (vor Zeile 3) bereits ein MWR154= auftaucht, weil die ersten zwei Zeilen jetzt so bleiben, wie sie sind, siehe Werners Kommentar: &quot;erst ab der zweiten Zeile sortieren&quot;, der nun natürlich heißen müsste: &quot;erst ab der dritten Zeile sortieren&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039694</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 25 Mar 2011 06:39:53 GMT</pubDate></item><item><title><![CDATA[Reply to Datei öffnen und Zeilen verschieben on Fri, 25 Mar 2011 08:04:40 GMT]]></title><description><![CDATA[<p>Luftikus schrieb:</p>
<blockquote>
<p>Habe mich heute früh mal Werner seiner guten Lösung gewidmet.</p>
</blockquote>
<p><a href="http://www.amazon.de/Dativ-ist-dem-Genitiv-sein/dp/3462034480" rel="nofollow">Der Dativ ist mein Tod</a>! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039714</guid><dc:creator><![CDATA[Genitiv]]></dc:creator><pubDate>Fri, 25 Mar 2011 08:04:40 GMT</pubDate></item><item><title><![CDATA[Reply to Datei öffnen und Zeilen verschieben on Fri, 25 Mar 2011 08:49:24 GMT]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2039730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2039730</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Fri, 25 Mar 2011 08:49:24 GMT</pubDate></item></channel></rss>