<?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[Der Streamzeiger macht nicht das, was ich will...]]></title><description><![CDATA[<p>Ich arbeite zur Zeit mit Hilfe von Visual C++ an einem Editor, der bestimmte Daten aus Dateien herausfischen soll (was genau, tut hier nichts zur Sache). Ich brauche aber aus den Dateien nur bestimmte Werte. Also verwende ich, um die überschüssigen Daten zu ignorieren, die Streamklassen ifstream und ofstream. Die Daten sollen ausgelesen (mit ifstream), angezeigt und für den Benutzer (also mich) veränderbar sein (eine Art Tuningprogramm). Dann sollen die geänderten Werte wieder in die ehemaligen Offsets geschrieben werden (mit ofstream).</p>
<p>Das Problem: da ich nur knapp 100 Werte aus beinahe 50.000 brauche, die auch noch ziemlich verteilt sind, um diese in Bearbeitungsfeldern anzeigen zu lassen, und ich keine Ahnung habe, wie man die Streamzeiger ändert, wende ich mich an dieses Forum. Zuerst hatte ich diese Methode im Sinn:</p>
<pre><code class="language-cpp">//...
#include &lt;fstream&gt;
//...

//////////////////////////////////////////////////
//Die Dialogfeldklasse, mit der ich arbeite
//////////////////////////////////////////////////

class CDialogfeldDlg : public CDialog
{
    //////////////////////////////////////////////////
    //Zuerst kommen Konstruktor, Nachrichtenschleifen,
    //Verbindungsfunktionen für IDs und Variablen...
    //dann der relevante Code...
    //////////////////////////////////////////////////

public:

    JumpToPointI(UINT Counter) // Mit dieser Funktion kann man den Streamzeiger
    {                          // &quot;vorspulen&quot; lassen, jeweils um eine angegebene
        for(;Counter;Counter--)// Menge Offsets. Man spult vor, speichert Werte,
           m_WriteData.get();  // spult vor, speichert Werte...
    }
    JumpToPointO(/*???*/)
    {
        // Was soll hier hin? Die Klasse ofstream verwendet keine Funktion wie
        // die ifstreams. Wie den Streamzeiger verändern?
    }

private:

    std::ifstream m_LoadData; // Lesezugriff
    std::ofstream m_WriteData;// Schreibezugriff
}
</code></pre>
<p>Kurze Analyse: m_LoadData soll nur lesen und Werte in hier nicht näher definierte Variablen schreiben, m_WriteData soll die Werte der Variablen (die eventuell vom Benutzer geändert wurden) wieder in die richtigen Stellen schreiben. Ich bin kein völliger Noob, da ich selbst versucht habe, den Wert im Zeiger zu verändern.</p>
<p>Erster Versuch:</p>
<pre><code class="language-cpp">m_WriteData::ios_base.cur += 0xff;
</code></pre>
<p>Hier spuckt mir mein Compiler (Microsoft Visual C++ 2008 Professional) eine Fehlermeldung aus. Grund: der Wert 0xff (255) ist ein Int, aber der Zeiger ist vom Typ &quot;_Seekdir&quot;, ein Enum, das dummerweise seit C++ Typensicherheit besitzt. Inkrementel kann ich den Zeiger nicht erhöhen, aber vielleicht kann man bereits gespeicherte Adressen zuweisen.</p>
<p>Zweiter Versuch:</p>
<pre><code class="language-cpp">class CDialogfeldDlg : public CDialog
{
    //////////////////////////////////////////////////
    //Wieder in der oben genannten Klasse...
    //////////////////////////////////////////////////

    std::ios_base::_Seekdir FirstOffset;
};

    //////////////////////////////////////////////////
    //In der Funktion JumpToPoint(std::ios_base::_Seekdir Offset)
    /////////////////////////////////////////////////

void CDialogfeldDlg::JumpToPointO(std::ios_base::_Seekdir Offset)
{
      m_WriteData::ios_base.cur = Offset; // Offset wurde in einer früheren 
                                          // Funktion bereits der zu diesem 
                                          // Zeitpunkt aktuelle Wert
                                          // zugewiesen...
}
</code></pre>
<p>Hier speichere ich zu einem früheren Zeitpunkt die Adresse und will sie wieder zuweisen, aber dummerweise ist der Zeiger schreibgeschützt und konstant.</p>
<p>Ist jemand in der Lage, zu helfen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243501/der-streamzeiger-macht-nicht-das-was-ich-will</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 02:34:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243501.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Jun 2009 14:11:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Der Streamzeiger macht nicht das, was ich will... on Wed, 17 Jun 2009 14:11:04 GMT]]></title><description><![CDATA[<p>Ich arbeite zur Zeit mit Hilfe von Visual C++ an einem Editor, der bestimmte Daten aus Dateien herausfischen soll (was genau, tut hier nichts zur Sache). Ich brauche aber aus den Dateien nur bestimmte Werte. Also verwende ich, um die überschüssigen Daten zu ignorieren, die Streamklassen ifstream und ofstream. Die Daten sollen ausgelesen (mit ifstream), angezeigt und für den Benutzer (also mich) veränderbar sein (eine Art Tuningprogramm). Dann sollen die geänderten Werte wieder in die ehemaligen Offsets geschrieben werden (mit ofstream).</p>
<p>Das Problem: da ich nur knapp 100 Werte aus beinahe 50.000 brauche, die auch noch ziemlich verteilt sind, um diese in Bearbeitungsfeldern anzeigen zu lassen, und ich keine Ahnung habe, wie man die Streamzeiger ändert, wende ich mich an dieses Forum. Zuerst hatte ich diese Methode im Sinn:</p>
<pre><code class="language-cpp">//...
#include &lt;fstream&gt;
//...

//////////////////////////////////////////////////
//Die Dialogfeldklasse, mit der ich arbeite
//////////////////////////////////////////////////

class CDialogfeldDlg : public CDialog
{
    //////////////////////////////////////////////////
    //Zuerst kommen Konstruktor, Nachrichtenschleifen,
    //Verbindungsfunktionen für IDs und Variablen...
    //dann der relevante Code...
    //////////////////////////////////////////////////

public:

    JumpToPointI(UINT Counter) // Mit dieser Funktion kann man den Streamzeiger
    {                          // &quot;vorspulen&quot; lassen, jeweils um eine angegebene
        for(;Counter;Counter--)// Menge Offsets. Man spult vor, speichert Werte,
           m_WriteData.get();  // spult vor, speichert Werte...
    }
    JumpToPointO(/*???*/)
    {
        // Was soll hier hin? Die Klasse ofstream verwendet keine Funktion wie
        // die ifstreams. Wie den Streamzeiger verändern?
    }

private:

    std::ifstream m_LoadData; // Lesezugriff
    std::ofstream m_WriteData;// Schreibezugriff
}
</code></pre>
<p>Kurze Analyse: m_LoadData soll nur lesen und Werte in hier nicht näher definierte Variablen schreiben, m_WriteData soll die Werte der Variablen (die eventuell vom Benutzer geändert wurden) wieder in die richtigen Stellen schreiben. Ich bin kein völliger Noob, da ich selbst versucht habe, den Wert im Zeiger zu verändern.</p>
<p>Erster Versuch:</p>
<pre><code class="language-cpp">m_WriteData::ios_base.cur += 0xff;
</code></pre>
<p>Hier spuckt mir mein Compiler (Microsoft Visual C++ 2008 Professional) eine Fehlermeldung aus. Grund: der Wert 0xff (255) ist ein Int, aber der Zeiger ist vom Typ &quot;_Seekdir&quot;, ein Enum, das dummerweise seit C++ Typensicherheit besitzt. Inkrementel kann ich den Zeiger nicht erhöhen, aber vielleicht kann man bereits gespeicherte Adressen zuweisen.</p>
<p>Zweiter Versuch:</p>
<pre><code class="language-cpp">class CDialogfeldDlg : public CDialog
{
    //////////////////////////////////////////////////
    //Wieder in der oben genannten Klasse...
    //////////////////////////////////////////////////

    std::ios_base::_Seekdir FirstOffset;
};

    //////////////////////////////////////////////////
    //In der Funktion JumpToPoint(std::ios_base::_Seekdir Offset)
    /////////////////////////////////////////////////

void CDialogfeldDlg::JumpToPointO(std::ios_base::_Seekdir Offset)
{
      m_WriteData::ios_base.cur = Offset; // Offset wurde in einer früheren 
                                          // Funktion bereits der zu diesem 
                                          // Zeitpunkt aktuelle Wert
                                          // zugewiesen...
}
</code></pre>
<p>Hier speichere ich zu einem früheren Zeitpunkt die Adresse und will sie wieder zuweisen, aber dummerweise ist der Zeiger schreibgeschützt und konstant.</p>
<p>Ist jemand in der Lage, zu helfen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728249</guid><dc:creator><![CDATA[Der aus dem Westen...]]></dc:creator><pubDate>Wed, 17 Jun 2009 14:11:04 GMT</pubDate></item><item><title><![CDATA[Reply to Der Streamzeiger macht nicht das, was ich will... on Wed, 17 Jun 2009 14:22:06 GMT]]></title><description><![CDATA[<p>Du könntest deine Daten mit std::ifstream in einen std::string schreiben, diesen dann bearbeiten, und dann die Datei mit dem veränderten std::string überschreiben. Da du bei std::string ja die Positionen an denen die Werte liegen speichern kannst, sollte es so funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728263</guid><dc:creator><![CDATA[Neo Gandar]]></dc:creator><pubDate>Wed, 17 Jun 2009 14:22:06 GMT</pubDate></item><item><title><![CDATA[Reply to Der Streamzeiger macht nicht das, was ich will... on Wed, 17 Jun 2009 14:28:49 GMT]]></title><description><![CDATA[<p>Könnte ich machen, aber dann würde ich den Speicher mit gut 50.000 Zeichen (von denen nur 100 wichtig sind) vollmüllen. Ich weiss, das sind nur 49 KB, aber ich würde lieder eine speicherschonendere Lösung finden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728266</guid><dc:creator><![CDATA[Der aus dem Westen...]]></dc:creator><pubDate>Wed, 17 Jun 2009 14:28:49 GMT</pubDate></item><item><title><![CDATA[Reply to Der Streamzeiger macht nicht das, was ich will... on Wed, 17 Jun 2009 15:01:57 GMT]]></title><description><![CDATA[<p>Zum gleichzeitigen Lesen und Schreiben muss man std::fstream (nur ein Objekt) benutzen.<br />
Innerhalb eines (File)Streams kann man sich mit seekg (-&gt; seek get; also Lesezeiger setzen) und mit seekp (-&gt; seek put; also Schreibzeiger setzen) bewegen.</p>
<p>Sind die Werte innerhalb der Datei textueller Natur oder arbeitest Du auf Byte-Ebene?<br />
Das macht einen großen Unterschied, in dem was nach dem seek* kommt.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728291</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 17 Jun 2009 15:01:57 GMT</pubDate></item><item><title><![CDATA[Reply to Der Streamzeiger macht nicht das, was ich will... on Wed, 17 Jun 2009 15:11:38 GMT]]></title><description><![CDATA[<p>Ich suche Werte, die von Windows als Zeichen (mit grausigen Konsequenzen), von Hexeditoren als 1-Byte-Wert und von den streams als Daten (die man in Zeichen oder Werte umwandeln kann) interpretiert werden, also Byte-Ebene. Es gibt allerdings auch ein paar Strings, und ich bräuchte an die Hundert Speicheradressen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728299</guid><dc:creator><![CDATA[Der aus dem Westen...]]></dc:creator><pubDate>Wed, 17 Jun 2009 15:11:38 GMT</pubDate></item><item><title><![CDATA[Reply to Der Streamzeiger macht nicht das, was ich will... on Wed, 17 Jun 2009 15:22:15 GMT]]></title><description><![CDATA[<p>Der aus dem Westen... schrieb:</p>
<blockquote>
<p>Ich suche Werte, die von Windows als Zeichen (mit grausigen Konsequenzen), von Hexeditoren als 1-Byte-Wert und von den streams als Daten (die man in Zeichen oder Werte umwandeln kann) interpretiert werden, also Byte-Ebene. Es gibt allerdings auch ein paar Strings, und ich bräuchte an die Hundert Speicheradressen.</p>
</blockquote>
<p>dann ist sicher ein anschließendes fstream.read und -.write angebracht. Im Prinzip sähe das so aus:</p>
<pre><code class="language-cpp">// bearbeite N Bytes an der Stelle Pos
    std::vector&lt; char &gt; buffer( N );
    file.seekg( std::fstream::pos_type( Pos ) );
    if( file.read( &amp;buffer[0], N ) )
    {
        // hier Werte in 'buffer' manipulieren 
        // ...
        file.seekp( std::fstream::pos_type( Pos ) );
        if( file.write( &amp;buffer[0], N ) )
        {
            // alles iO
        }
    }
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728309</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 17 Jun 2009 15:22:15 GMT</pubDate></item><item><title><![CDATA[Reply to Der Streamzeiger macht nicht das, was ich will... on Wed, 17 Jun 2009 15:35:19 GMT]]></title><description><![CDATA[<p>Danke, ich werd's versuchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728316</guid><dc:creator><![CDATA[Der aus dem Westen]]></dc:creator><pubDate>Wed, 17 Jun 2009 15:35:19 GMT</pubDate></item></channel></rss>