<?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[Daten an eine bestimmte Position in einer bestehenden Datei schreiben]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mittlerweile so ziemlich alles durchforscht in der Hoffnung mein Problem zu lösen ohne einen neuen Thread zu eröffnen. Leider konnte mir nichts so richtig weiterhelfen. Wahrscheinlich ist es für die Profis unter euch gerade zu banal, aber ich verzweifle so langsam daran.</p>
<p>Eigentlich will ich ja nur ein kleines Programm schreiben das Daten aus einer bestehenden Datei liest, diese mit einen Vergleichswert vergleicht und, sollte es eine Übereinstimmung geben, an Stelle des übereinstimmenden Datensatzes einen Neueintrag an die Position des alten Datensatzes in die bestehende Datei schreibt.</p>
<p>Bis zu einen gewissen Punkt wusste ich wie ich das angehen sollte, und obwohl das Programm läuft, gibt es eine Sache die einfach nicht so funktionieren will, wie sie eigentlich sollte.</p>
<pre><code class="language-cpp">int i, rs;
char cf[20]; //Variable für den Pfad der Datei
char n;
char *comp = &quot;u&quot;;
using namespace std;

....
fstream f(cf,ios::in); //in cf steht der Dateipfad, da man diesen auswählen kann
                      //Damit sollte die Datei zum lesen geöffnet sein
while (!f.eof()) //solange bis das Dateiende erreicht ist
        {
        f &gt;&gt; n; //ließ den Stream in die Variable n - ist in dem Fall okay, weil er sowieso Zeichen für Zeichen einlesen muss
        i = f.tellg(); //die Cursurposition beim Lesen wird erfasst
        rs = (CompareStr(comp,n)); //ist der eingelesene Wert der gesuchte?
            if (rs==0) //wenn ja dann ...
                {
                fstream f(cf,ios::ate); //öffne die Datei zum Schreiben
                f.seekp(i,ios::beg); //setzte den Cursor an die Position des alten bzw. gesuchten Wertes
                f &lt;&lt; &quot; z&quot;; //schreib &quot; z&quot; an die gewählte Stelle
                }
</code></pre>
<p>Nahezu alles klappt. Das Einlesen, der Vergleich, selbst das Cursorsetzen scheint zu gehen, nur eben der Schreibvorgang selbst nicht.<br />
Dabei sollte ich mit ios::ate ja eigentlich die Möglichkeit haben, den Cursor neu zu positionieren, nachdem er ans Dateiende gesetzt wird. Mit ios::app oder ios::out, funktioniert der Schreibvorgang, nur eben nicht so wie gewünscht, da ios::app bloß immer ans Ende anhängt und ios::out die komplette Datei überschreibt und danach nur noch der neue Eintrag darin steht. Es wäre ja nicht so dramatisch wenn unter ios::ate die Position des neuen Eintrages nicht stimmen würde, denn dann wäre das Problem ein ganz anderes, aber er schreibt ja rein gar nichts.<br />
Wieso funktioniert ios::ate bei mir nicht? Ich hoffe ihr könnt mir helfen.</p>
<p>)Ich kann mir im übrigen denken das man bei meinem Quellcode so einiges tunen könnte (wie zum Beispiel den Vergleich), aber das soll mal nebensächlich sein.)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/130125/daten-an-eine-bestimmte-position-in-einer-bestehenden-datei-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 22:57:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/130125.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Dec 2005 21:11:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Daten an eine bestimmte Position in einer bestehenden Datei schreiben on Tue, 20 Dec 2005 08:44:48 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mittlerweile so ziemlich alles durchforscht in der Hoffnung mein Problem zu lösen ohne einen neuen Thread zu eröffnen. Leider konnte mir nichts so richtig weiterhelfen. Wahrscheinlich ist es für die Profis unter euch gerade zu banal, aber ich verzweifle so langsam daran.</p>
<p>Eigentlich will ich ja nur ein kleines Programm schreiben das Daten aus einer bestehenden Datei liest, diese mit einen Vergleichswert vergleicht und, sollte es eine Übereinstimmung geben, an Stelle des übereinstimmenden Datensatzes einen Neueintrag an die Position des alten Datensatzes in die bestehende Datei schreibt.</p>
<p>Bis zu einen gewissen Punkt wusste ich wie ich das angehen sollte, und obwohl das Programm läuft, gibt es eine Sache die einfach nicht so funktionieren will, wie sie eigentlich sollte.</p>
<pre><code class="language-cpp">int i, rs;
char cf[20]; //Variable für den Pfad der Datei
char n;
char *comp = &quot;u&quot;;
using namespace std;

....
fstream f(cf,ios::in); //in cf steht der Dateipfad, da man diesen auswählen kann
                      //Damit sollte die Datei zum lesen geöffnet sein
while (!f.eof()) //solange bis das Dateiende erreicht ist
        {
        f &gt;&gt; n; //ließ den Stream in die Variable n - ist in dem Fall okay, weil er sowieso Zeichen für Zeichen einlesen muss
        i = f.tellg(); //die Cursurposition beim Lesen wird erfasst
        rs = (CompareStr(comp,n)); //ist der eingelesene Wert der gesuchte?
            if (rs==0) //wenn ja dann ...
                {
                fstream f(cf,ios::ate); //öffne die Datei zum Schreiben
                f.seekp(i,ios::beg); //setzte den Cursor an die Position des alten bzw. gesuchten Wertes
                f &lt;&lt; &quot; z&quot;; //schreib &quot; z&quot; an die gewählte Stelle
                }
</code></pre>
<p>Nahezu alles klappt. Das Einlesen, der Vergleich, selbst das Cursorsetzen scheint zu gehen, nur eben der Schreibvorgang selbst nicht.<br />
Dabei sollte ich mit ios::ate ja eigentlich die Möglichkeit haben, den Cursor neu zu positionieren, nachdem er ans Dateiende gesetzt wird. Mit ios::app oder ios::out, funktioniert der Schreibvorgang, nur eben nicht so wie gewünscht, da ios::app bloß immer ans Ende anhängt und ios::out die komplette Datei überschreibt und danach nur noch der neue Eintrag darin steht. Es wäre ja nicht so dramatisch wenn unter ios::ate die Position des neuen Eintrages nicht stimmen würde, denn dann wäre das Problem ein ganz anderes, aber er schreibt ja rein gar nichts.<br />
Wieso funktioniert ios::ate bei mir nicht? Ich hoffe ihr könnt mir helfen.</p>
<p>)Ich kann mir im übrigen denken das man bei meinem Quellcode so einiges tunen könnte (wie zum Beispiel den Vergleich), aber das soll mal nebensächlich sein.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/945955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/945955</guid><dc:creator><![CDATA[Kyle]]></dc:creator><pubDate>Tue, 20 Dec 2005 08:44:48 GMT</pubDate></item><item><title><![CDATA[Reply to Daten an eine bestimmte Position in einer bestehenden Datei schreiben on Mon, 19 Dec 2005 21:26:13 GMT]]></title><description><![CDATA[<p>fopen, fseek? (ist c)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/945965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/945965</guid><dc:creator><![CDATA[c.rackwitz]]></dc:creator><pubDate>Mon, 19 Dec 2005 21:26:13 GMT</pubDate></item><item><title><![CDATA[Reply to Daten an eine bestimmte Position in einer bestehenden Datei schreiben on Mon, 19 Dec 2005 21:51:21 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>nimm TStringList, lad damit die Datei in den Speicher, nimm die Änderung vor, und überschreib die Datei mit den neuen Daten.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/945983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/945983</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Mon, 19 Dec 2005 21:51:21 GMT</pubDate></item><item><title><![CDATA[Reply to Daten an eine bestimmte Position in einer bestehenden Datei schreiben on Tue, 20 Dec 2005 06:43:32 GMT]]></title><description><![CDATA[<p>Na ja, gut. Aber damit weiß ich immer noch nicht warum mein Programm nicht so arbeitet wie es sollte.<br />
f.open und f.seek hatte ich auch schon probiert, kam aber auf's gleiche raus.<br />
Und bei TStringList müsste ich erst mal wieder lernen wie das genau funktioniert und ob es wirklich geeignet ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/946071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946071</guid><dc:creator><![CDATA[Kyle]]></dc:creator><pubDate>Tue, 20 Dec 2005 06:43:32 GMT</pubDate></item><item><title><![CDATA[Reply to Daten an eine bestimmte Position in einer bestehenden Datei schreiben on Tue, 20 Dec 2005 13:28:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Kann es vielleicht sein, dass du auf eine Datei, die du noch zum Lesen geöffnet hast, keine Schreibrechte besitzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/946289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946289</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 20 Dec 2005 13:28:03 GMT</pubDate></item><item><title><![CDATA[Reply to Daten an eine bestimmte Position in einer bestehenden Datei schreiben on Tue, 20 Dec 2005 14:07:52 GMT]]></title><description><![CDATA[<p>Das dachte ich mir auch schon, aber warum sollte es dann mit ios::app und ios::out funktionieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/946312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946312</guid><dc:creator><![CDATA[Kyle]]></dc:creator><pubDate>Tue, 20 Dec 2005 14:07:52 GMT</pubDate></item><item><title><![CDATA[Reply to Daten an eine bestimmte Position in einer bestehenden Datei schreiben on Wed, 21 Dec 2005 07:55:45 GMT]]></title><description><![CDATA[<p>Warum öffnest du die Datei nicht gleich im R/W-Modus (mit &quot;fstream f(cf,ios::in|ios::out)&quot;)? Dann mußt du nur aufpassen, daß du zwischen den Schreib- und Lesevorgängen ein flush einbaust, um die Daten zu synchronisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/946788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946788</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 21 Dec 2005 07:55:45 GMT</pubDate></item><item><title><![CDATA[Reply to Daten an eine bestimmte Position in einer bestehenden Datei schreiben on Wed, 21 Dec 2005 09:00:02 GMT]]></title><description><![CDATA[<p>Weil ios::out dazu neigt die komplette Datei zu überschreiben und nicht nur ein einzelnes Zeichen. Erstaunlich, dass auch das meine Frage nicht beantworten kann, warum mein Program nicht funktioniert <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>
]]></description><link>https://www.c-plusplus.net/forum/post/946825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946825</guid><dc:creator><![CDATA[Kyle]]></dc:creator><pubDate>Wed, 21 Dec 2005 09:00:02 GMT</pubDate></item><item><title><![CDATA[Reply to Daten an eine bestimmte Position in einer bestehenden Datei schreiben on Wed, 21 Dec 2005 09:44:05 GMT]]></title><description><![CDATA[<p>Kyle schrieb:</p>
<blockquote>
<p>Weil ios::out dazu neigt die komplette Datei zu überschreiben und nicht nur ein einzelnes Zeichen.</p>
</blockquote>
<p>Deswegen sagte ich ja &quot;<strong>ios::in|ios::out</strong>&quot; <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="😉"
    /><br />
Du öffnest die Datei einmal zum Lesen <strong>und</strong> Schreiben und lässt sie dann während der Arbeit geöffnet.</p>
<p>*zitiert aus der MDSN*</p>
<blockquote>
<p><em>nMode</em><br />
An integer that contains mode bits defined as ios enumerators that can be combined with the bitwise OR ( | ) operator. The nMode parameter must have one of the following values:</p>
<ul>
<li><strong>ios::app</strong> The function performs a seek to the end of file. When new bytes are written to the file, they are always appended to the end, even if the position is moved with the ostream::seekp function.</li>
<li><strong>ios::ate</strong> The function performs a seek to the end of file. When the first new byte is written to the file, it is appended to the end, but when subsequent bytes are written, they are written to the current position.</li>
<li><strong>ios::in</strong> The file is opened for input. The original file (if it exists) will not be truncated.</li>
<li><strong>ios::out</strong> The file is opened for output.</li>
<li><strong>ios::trunc</strong> If the file already exists, its contents are discarded. This mode is implied if ios::out is specified, and ios::ate, ios::app, and ios:in are not specified.</li>
<li><strong>ios::nocreate</strong> If the file does not already exist, the function fails.</li>
<li><strong>ios::noreplace</strong> If the file already exists, the function fails.</li>
<li><strong>ios::binary</strong> Opens the file in binary mode (the default is text mode).<br />
Note that there is no ios::in or ios::out default mode for fstream objects. You must specify both modes if your fstream object must both read and write files.</li>
</ul>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/946852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/946852</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Wed, 21 Dec 2005 09:44:05 GMT</pubDate></item></channel></rss>