<?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[struct-Aray speichern (2) - Meine Lösung]]></title><description><![CDATA[<p>Hallo,<br />
nachdem ich etliche Anregungen zu diesem Thema in diesem Forum erhalten habe, möchte ich hier einmal meine Lösung vorstellen, denn ich denke, da gibts vielleicht was zu verbessern <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>
<p>Die beispiel Struct ist folgende:</p>
<pre><code class="language-cpp">struct Ding
        {
        AnsiString Name;
        int a;
        void write(AnsiString DatName, int i);
        void read(AnsiString DatName, int i);
        }     ;
</code></pre>
<p>Mein Problem waren die Methoden read() und write() für den fall, dass ich von der Struct eine Array anlege, etwa so:</p>
<pre><code class="language-cpp">Ding test[5];
</code></pre>
<p>Folgende Lösung hab ich nun nach intensiver Nutzung der erhaltenen Hinweise und der Hilfefunktionen gefunden:</p>
<pre><code class="language-cpp">void Ding::write(AnsiString DatName, int i)
{
 int oFileHandle;

 if (i==0)
    oFileHandle = FileCreate(DatName);
 else
     oFileHandle = FileOpen(DatName,fmOpenWrite	) ;

 FileSeek(oFileHandle, 0, 2); //Zeiger ans Ende der datei setzen

 int strsize = Name.Length();
 FileWrite(oFileHandle,(char *) &amp;strsize, sizeof(strsize)) ;

 FileWrite(oFileHandle, Name.c_str(), strsize +1);
 FileWrite(oFileHandle, (char *) &amp;a, sizeof(a));

 FileClose(oFileHandle);
} ;

void Ding::read(AnsiString DatName,int i) //gehts auch ohne int i ???
{
 int iFileHandle;

 iFileHandle = FileOpen(DatName,fmOpenRead );

 int strsize;
 for (int anz =0; anz &lt;=i; anz++)
     {
     FileRead(iFileHandle,(char*) &amp;strsize, sizeof(strsize));
     char *tstr= new char[strsize + 1];
     FileRead(iFileHandle,tstr, strsize+1);
     Name = AnsiString(tstr);

     FileRead(iFileHandle,(char*) &amp;a, sizeof(a));
     }

 FileClose(iFileHandle);

} ;
</code></pre>
<p>Die datei schreiben bzw. lesen geht dann so:</p>
<pre><code class="language-cpp">//Schreiben
for (int i = 0; i&lt;5; i++)
    {
    test[i].write(&quot;daten.txt&quot;, i) ;
    }

//Lesen
for (int i = 0; i&lt;5; i++)
    {
    test2[i].read(&quot;daten.txt&quot;,i) ;
    ;
    }
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Meine Frage: gehts auch ohne den Übergabeparameter int i, mit welchem ich unterscheide, ob das erste Arrayelement (bei write)geschrieben bzw. welches Arrayelement (bei read) gelesen wird. Im Falle von read ist es so, das er mit jedem neuen Aufruf die datei von Anfang an durchläuft, was bei großen Arrays sehr zeitaufwendig ist.</p>
<p>Über Hinweise würde ich mich sehr freuen</p>
<p>Grüße von sehreilig</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/108738/struct-aray-speichern-2-meine-lösung</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 03:22:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/108738.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 May 2005 17:13:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to struct-Aray speichern (2) - Meine Lösung on Mon, 02 May 2005 17:13:43 GMT]]></title><description><![CDATA[<p>Hallo,<br />
nachdem ich etliche Anregungen zu diesem Thema in diesem Forum erhalten habe, möchte ich hier einmal meine Lösung vorstellen, denn ich denke, da gibts vielleicht was zu verbessern <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>
<p>Die beispiel Struct ist folgende:</p>
<pre><code class="language-cpp">struct Ding
        {
        AnsiString Name;
        int a;
        void write(AnsiString DatName, int i);
        void read(AnsiString DatName, int i);
        }     ;
</code></pre>
<p>Mein Problem waren die Methoden read() und write() für den fall, dass ich von der Struct eine Array anlege, etwa so:</p>
<pre><code class="language-cpp">Ding test[5];
</code></pre>
<p>Folgende Lösung hab ich nun nach intensiver Nutzung der erhaltenen Hinweise und der Hilfefunktionen gefunden:</p>
<pre><code class="language-cpp">void Ding::write(AnsiString DatName, int i)
{
 int oFileHandle;

 if (i==0)
    oFileHandle = FileCreate(DatName);
 else
     oFileHandle = FileOpen(DatName,fmOpenWrite	) ;

 FileSeek(oFileHandle, 0, 2); //Zeiger ans Ende der datei setzen

 int strsize = Name.Length();
 FileWrite(oFileHandle,(char *) &amp;strsize, sizeof(strsize)) ;

 FileWrite(oFileHandle, Name.c_str(), strsize +1);
 FileWrite(oFileHandle, (char *) &amp;a, sizeof(a));

 FileClose(oFileHandle);
} ;

void Ding::read(AnsiString DatName,int i) //gehts auch ohne int i ???
{
 int iFileHandle;

 iFileHandle = FileOpen(DatName,fmOpenRead );

 int strsize;
 for (int anz =0; anz &lt;=i; anz++)
     {
     FileRead(iFileHandle,(char*) &amp;strsize, sizeof(strsize));
     char *tstr= new char[strsize + 1];
     FileRead(iFileHandle,tstr, strsize+1);
     Name = AnsiString(tstr);

     FileRead(iFileHandle,(char*) &amp;a, sizeof(a));
     }

 FileClose(iFileHandle);

} ;
</code></pre>
<p>Die datei schreiben bzw. lesen geht dann so:</p>
<pre><code class="language-cpp">//Schreiben
for (int i = 0; i&lt;5; i++)
    {
    test[i].write(&quot;daten.txt&quot;, i) ;
    }

//Lesen
for (int i = 0; i&lt;5; i++)
    {
    test2[i].read(&quot;daten.txt&quot;,i) ;
    ;
    }
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Meine Frage: gehts auch ohne den Übergabeparameter int i, mit welchem ich unterscheide, ob das erste Arrayelement (bei write)geschrieben bzw. welches Arrayelement (bei read) gelesen wird. Im Falle von read ist es so, das er mit jedem neuen Aufruf die datei von Anfang an durchläuft, was bei großen Arrays sehr zeitaufwendig ist.</p>
<p>Über Hinweise würde ich mich sehr freuen</p>
<p>Grüße von sehreilig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/780347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/780347</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Mon, 02 May 2005 17:13:43 GMT</pubDate></item><item><title><![CDATA[Reply to struct-Aray speichern (2) - Meine Lösung on Mon, 02 May 2005 18:27:29 GMT]]></title><description><![CDATA[<p>Das bitte in den Originalthread posten.</p>
<p>Faustregel: ein Thema pro Thread, ein Thread pro Thema.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/780394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/780394</guid><dc:creator><![CDATA[Jansen]]></dc:creator><pubDate>Mon, 02 May 2005 18:27:29 GMT</pubDate></item></channel></rss>