<?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[Beim Dateiauslesen in Schleife &amp;quot;zurückgreifen&amp;quot;]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe grad folgendes Problem, Quelltext unten. Ich habe eine Datei Daten.dat, in der zeilweise je 3 Werte stehen, ich nenne sie x, y, z. Diese sollen ausgelesen, damit eine Rechnung angestellt werden und in einbe neue Datei ausgegeben werden. Soweit sogut. Nun muss bei der Berechnung nicht das &quot;aktuelle&quot; x genutzt werden, bei welchem sich die While-Schleife gerade befindet, sondern quasi das aus der letzte Zeile (es geht um (x<sub>i</sub> - x<sub>i-1</sub>)/(y<sub>i</sub> - y<sub>i-1</sub>)</p>
<p>Optimaler weise benötige ich sogar das x aus der letzten Zeile UND aus der nächsten ((x<sub>i+1</sub> - x<sub>i-1</sub>)/(y<sub>i+1</sub> - y<sub>i-1</sub>))!</p>
<p>Wie baue ich sowas in meinen Code ein? Habe es schon versucht, mit c=(letztesx-x)/(letztesy-y) und das Programm danach erst das aktuelle letztesx = x und letztesy = y definieren zu lassen, sodass man immer das letzte nimmt. Ist aber nicht so zufriedenstellend...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
int main() {
    double x, y, z, a, b, c;
    std::ofstream out;
    std::fstream io;
    out.open(&quot;Daten.dat&quot;,std::ios::app);
    out &lt;&lt; &quot;# Zeit x  Wert b  Wert c &quot; &lt;&lt; std::endl;
    std::ifstream in(&quot;Bewegung.dat&quot;);
    in.ignore(80,'\n');
    while (!in.eof()) {
          in &gt;&gt; x &gt;&gt; y &gt;&gt; z;
          a = x
          b = 9.81 * y * 6.51
          c = ([nächstes x] - [letztes x]) / ([nächstes y] - [letztes y]
          std::ofstream out;
          std::fstream io;
          out.open(&quot;Ausgabe.dat&quot;,std::ios::app);
          out &lt;&lt; a &lt;&lt; &quot;  &quot; &lt;&lt; b &lt;&lt; &quot;  &quot; &lt;&lt; c &lt;&lt; std::endl;
          }
          in.close();
    return 0;
}
</code></pre>
<p>Hoffe mich versteht jemand <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>
<p>Gruß,<br />
Erding</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/295530/beim-dateiauslesen-in-schleife-quot-zurückgreifen-quot</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 11:15:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/295530.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Nov 2011 01:44:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Beim Dateiauslesen in Schleife &amp;quot;zurückgreifen&amp;quot; on Wed, 16 Nov 2011 01:44:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe grad folgendes Problem, Quelltext unten. Ich habe eine Datei Daten.dat, in der zeilweise je 3 Werte stehen, ich nenne sie x, y, z. Diese sollen ausgelesen, damit eine Rechnung angestellt werden und in einbe neue Datei ausgegeben werden. Soweit sogut. Nun muss bei der Berechnung nicht das &quot;aktuelle&quot; x genutzt werden, bei welchem sich die While-Schleife gerade befindet, sondern quasi das aus der letzte Zeile (es geht um (x<sub>i</sub> - x<sub>i-1</sub>)/(y<sub>i</sub> - y<sub>i-1</sub>)</p>
<p>Optimaler weise benötige ich sogar das x aus der letzten Zeile UND aus der nächsten ((x<sub>i+1</sub> - x<sub>i-1</sub>)/(y<sub>i+1</sub> - y<sub>i-1</sub>))!</p>
<p>Wie baue ich sowas in meinen Code ein? Habe es schon versucht, mit c=(letztesx-x)/(letztesy-y) und das Programm danach erst das aktuelle letztesx = x und letztesy = y definieren zu lassen, sodass man immer das letzte nimmt. Ist aber nicht so zufriedenstellend...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
int main() {
    double x, y, z, a, b, c;
    std::ofstream out;
    std::fstream io;
    out.open(&quot;Daten.dat&quot;,std::ios::app);
    out &lt;&lt; &quot;# Zeit x  Wert b  Wert c &quot; &lt;&lt; std::endl;
    std::ifstream in(&quot;Bewegung.dat&quot;);
    in.ignore(80,'\n');
    while (!in.eof()) {
          in &gt;&gt; x &gt;&gt; y &gt;&gt; z;
          a = x
          b = 9.81 * y * 6.51
          c = ([nächstes x] - [letztes x]) / ([nächstes y] - [letztes y]
          std::ofstream out;
          std::fstream io;
          out.open(&quot;Ausgabe.dat&quot;,std::ios::app);
          out &lt;&lt; a &lt;&lt; &quot;  &quot; &lt;&lt; b &lt;&lt; &quot;  &quot; &lt;&lt; c &lt;&lt; std::endl;
          }
          in.close();
    return 0;
}
</code></pre>
<p>Hoffe mich versteht jemand <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>
<p>Gruß,<br />
Erding</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2145041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2145041</guid><dc:creator><![CDATA[Erding]]></dc:creator><pubDate>Wed, 16 Nov 2011 01:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Dateiauslesen in Schleife &amp;quot;zurückgreifen&amp;quot; on Wed, 16 Nov 2011 05:31:38 GMT]]></title><description><![CDATA[<p>Warum muss unbedingt alles in einer Schleife passieren? Trenne die beiden Aufgaben (Einlesen, Berechnen+Ausgeben) doch einfach. Lies deine Werte in einen <code>std::vector</code> ein. Und im Anschluss kannst du in einer zweiten Schleife ganz in Ruhe berechnen und dabei ganz easy im <code>std::vector</code> navigieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2145052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2145052</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 16 Nov 2011 05:31:38 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Dateiauslesen in Schleife &amp;quot;zurückgreifen&amp;quot; on Wed, 16 Nov 2011 05:35:21 GMT]]></title><description><![CDATA[<p>Würde auch zuerst einlesen, außer wenn die Datei zu groß ist. Dann machst du dir ein double x[3] und schiebst durch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2145053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2145053</guid><dc:creator><![CDATA[ja]]></dc:creator><pubDate>Wed, 16 Nov 2011 05:35:21 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Dateiauslesen in Schleife &amp;quot;zurückgreifen&amp;quot; on Wed, 16 Nov 2011 08:37:41 GMT]]></title><description><![CDATA[<p>Erstmal muss man fragen, ob Du den Code überhaupt verstehst...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
int main() {
    double x, y, z, a, b, c;
    std::ofstream out; //man kann hier direkt eine Datei öffnen
    std::fstream io; //wozu? Du benutzt das nirgends.
    out.open(&quot;Daten.dat&quot;,std::ios::app); //braucht man nicht, siehe oben
    out &lt;&lt; &quot;# Zeit x  Wert b  Wert c &quot; &lt;&lt; std::endl;
    std::ifstream in(&quot;Bewegung.dat&quot;); //hier machst Du es direkt, nicht wie oben bei out
    in.ignore(80,'\n');
    while (!in.eof()) { 
          in &gt;&gt; x &gt;&gt; y &gt;&gt; z;
          a = x
          b = 9.81 * y * 6.51
          c = ([nächstes x] - [letztes x]) / ([nächstes y] - [letztes y]
          std::ofstream out; //was soll das? Du hast oben schon ein ofstream-Objekt angelegt
          std::fstream io; //wozu? Du benutzt das nirgends und hast oben schon ein Objekt mit gleichem Namen angelegt.
          out.open(&quot;Ausgabe.dat&quot;,std::ios::app); //siehe oben
          out &lt;&lt; a &lt;&lt; &quot;  &quot; &lt;&lt; b &lt;&lt; &quot;  &quot; &lt;&lt; c &lt;&lt; std::endl;
          }
          in.close(); //passiert automatisch. out schließt Du ja auch nicht.
    return 0;
}
</code></pre>
<p>Mal Hand aufs Herz, hast Du das selbst geschrieben, oder irgendwo abgetippt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2145083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2145083</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 16 Nov 2011 08:37:41 GMT</pubDate></item><item><title><![CDATA[Reply to Beim Dateiauslesen in Schleife &amp;quot;zurückgreifen&amp;quot; on Wed, 16 Nov 2011 08:41:56 GMT]]></title><description><![CDATA[<p>Hallo Erding,</p>
<p>willkommen im C++-Forum.</p>
<p>Dein Problem ist eine typische Anwendung für einen <a href="http://de.wikipedia.org/wiki/Warteschlange_%28Datenstruktur%29" rel="nofollow">Queue-Meachanismus</a>. Dazu kannst Du die <a href="http://www.cplusplus.com/reference/stl/queue/" rel="nofollow">std::queue</a> verwenden, in der in Deinem Fall immer die letzten beiden Einträge gespeichert werden.</p>
<p>Ich habe Deinen Code noch etwas entrümpelt - dann sieht es so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;deque&gt;
#include &lt;utility&gt; // std::pair&lt;&gt;
#include &lt;limits&gt; // numeric_limits&lt;&gt;::max()

std::istream&amp; skipline( std::istream&amp; in )
{
    return in.ignore(std::numeric_limits&lt; std::streamsize &gt;::max(),'\n');
}

int main() {
    std::ofstream out1(&quot;Daten.dat&quot;,std::ios::app);
    out1 &lt;&lt; &quot;# Zeit x  Wert b  Wert c &quot; &lt;&lt; std::endl;

    std::ofstream out2(&quot;Ausgabe.dat&quot;,std::ios::app);
    std::ifstream in(&quot;Bewegung.dat&quot;);
    in &gt;&gt; skipline;
    std::deque&lt; std::pair&lt; double, double &gt; &gt; pipe;
    for( double x, y; in &gt;&gt; x &gt;&gt; y &gt;&gt; skipline; pipe.push_back( std::make_pair( x, y ) ) ) {
        if( pipe.size() &lt; 2 )
            continue;
        double a = x;
        double b = 9.81 * y * 6.51;
        double c = (x - pipe.front().first) / (y - pipe.front().second);
        out2 &lt;&lt; a &lt;&lt; &quot;  &quot; &lt;&lt; b &lt;&lt; &quot;  &quot; &lt;&lt; c &lt;&lt; std::endl;
        pipe.pop_front();
    }
    return 0;
}
</code></pre>
<p>noch ein Tipp in Zeile 24 steht noch 9.81, was wahrscheinlich die Erdbeschleunigung sein soll. Dafür verwendet man besser sogenannte sprechende Konstanten. Schreibe vor Dein main-Programm</p>
<pre><code class="language-cpp">namespace physics
{
    const double g = 9.80665; // m/s^2 nach http://de.wikipedia.org/wiki/Erdbeschleunigung
}
</code></pre>
<p>und die Zeile 24 wird zu</p>
<pre><code class="language-cpp">double b = physics::g * y * 6.51;
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2145087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2145087</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 16 Nov 2011 08:41:56 GMT</pubDate></item></channel></rss>