<?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[Structure-array speichern]]></title><description><![CDATA[<p>Hallo,<br />
wie kann ich den Inhalt eines Arrays, welches vom Typ einer Structure ist (vereinfachtes Beispiel):</p>
<pre><code>[cpp]struct Ding {AnsiString Name, int Anzahl};
Ding Dinge[200]; [/cpp]
</code></pre>
<p>möglichst einfach in eine Datei schreiben?</p>
<p>Wer kann mir da einen Tip geben?</p>
<p>Vielen Dank von sehreilig</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/107754/structure-array-speichern</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 04:13:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/107754.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Apr 2005 14:27:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Structure-array speichern on Fri, 22 Apr 2005 14:27:14 GMT]]></title><description><![CDATA[<p>Hallo,<br />
wie kann ich den Inhalt eines Arrays, welches vom Typ einer Structure ist (vereinfachtes Beispiel):</p>
<pre><code>[cpp]struct Ding {AnsiString Name, int Anzahl};
Ding Dinge[200]; [/cpp]
</code></pre>
<p>möglichst einfach in eine Datei schreiben?</p>
<p>Wer kann mir da einen Tip geben?</p>
<p>Vielen Dank von sehreilig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/773030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/773030</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Fri, 22 Apr 2005 14:27:14 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Fri, 22 Apr 2005 14:34:54 GMT]]></title><description><![CDATA[<p>kommt drauf an, wie du es speichern willst. binär oder als text.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/773038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/773038</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Fri, 22 Apr 2005 14:34:54 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Fri, 22 Apr 2005 14:43:50 GMT]]></title><description><![CDATA[<p>Sunday schrieb:</p>
<blockquote>
<p>kommt drauf an, wie du es speichern willst. binär oder als text.</p>
</blockquote>
<p>Sollte binär sein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/773048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/773048</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Fri, 22 Apr 2005 14:43:50 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Sat, 23 Apr 2005 16:12:04 GMT]]></title><description><![CDATA[<p>Ich habe das mal gemacht, allerdings habe ich ein dynamisches array gehabt, da ich während der Laufzeit neue Instanzen gebildet habe.<br />
ansonsten habe ich das array in einer ini file gespeichert, geht aber genauso mit filesave. Du musst nur den array namen beim speichern übergeben, wie bei einer einfachen variablen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/773700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/773700</guid><dc:creator><![CDATA[Scooby]]></dc:creator><pubDate>Sat, 23 Apr 2005 16:12:04 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Mon, 25 Apr 2005 08:01:39 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antwort. Leider kann ich deine Antwort nicht direkt umsetzen. Könntest du mir vielleicht einen Prinzip-Quelltext senden?</p>
<p>Grüße von eilig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/774661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/774661</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Mon, 25 Apr 2005 08:01:39 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Mon, 25 Apr 2005 08:36:39 GMT]]></title><description><![CDATA[<p>Bei solchen Konstrukten habe ich immer Probleme mit den Strings. Bislang konnte ich es nur so lösen, dass ich zunächst die Länge und dann den String selbst abgespeichert habe. Weil die einzelnen structs keine konstante Größe haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/774687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/774687</guid><dc:creator><![CDATA[Dasd]]></dc:creator><pubDate>Mon, 25 Apr 2005 08:36:39 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Tue, 26 Apr 2005 07:14:52 GMT]]></title><description><![CDATA[<p>Hallo Dasd,<br />
vielen dank. Das ist auch meine Erfahrung. Ich hab bisher in einer Schleife alle Inhalte des Arrays in eine StringList geschrieben und dann abgespeichert. Ich hoffte aber, dass es da auch eine einfachere Möglichkeit gibt.<br />
Grüße von sehreilig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/775582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/775582</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Tue, 26 Apr 2005 07:14:52 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Tue, 26 Apr 2005 07:32:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Solange nur dieser eine String in deiner Struct steht, ist die Lösung über eine Stringlist fast noch das einfachste. Wenn du direkt binär in eine Datei schreiben willst musst du natürlich (wie schon gesagt) erst die Länge und dann den String selbst schreiben. Um die Schnittstelle zu vereinfachen würde es sich anbieten read/write Funktionen für deine Strukt zu schreiben (als Member für einen fstream oder TStream).<br />
Vielleicht so (nur für write als Beispiel)</p>
<pre><code class="language-cpp">struct Ding 
{
   AnsiString Name;
   int Anzahl;  // wofür ist das?
   void write(TStream *out);
   void read(TStream *in);
};

void Ding::write(TStream *out)
{
   int strsize =  Name.Length();
   out-&gt;Write(Name.c_str(), strsize+1);
}
</code></pre>
<p>read überlasse ich dir mal (nur wenn du das so machen willst).<br />
Diese Funktionen kannst du dann problemlos in einer Schleife aufrufen.</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/775590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/775590</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 26 Apr 2005 07:32:08 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Tue, 26 Apr 2005 17:44:20 GMT]]></title><description><![CDATA[<p>Ja, dass sieht schon mal sehr übersichtlich aus.<br />
Vielen Dank !<br />
Noch eine Frage, weil ich bisher noch nicht <em>read</em> und <em>write</em> verwendet habe:</p>
<p>Liege ich richtig, dass die Zeilen</p>
<pre><code class="language-cpp">void Ding::write(TStream *out)
{
   int strsize =  Name.Length();
   out-&gt;Write(Name.c_str(), strsize+1);
}
</code></pre>
<p>so verändert werden müssen, um den gesamten Inhalt der Structure zu speichern:</p>
<pre><code class="language-cpp">void Ding::write(TStream *out)
{
   int strsize =  Name.Length();
   out-&gt;Write(strsize+1, Name.c_str(), Anzahl);
}
</code></pre>
<p>Grüße von sehreilig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/776105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/776105</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Tue, 26 Apr 2005 17:44:20 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Wed, 27 Apr 2005 07:19:19 GMT]]></title><description><![CDATA[<p>Nein, du mußt jede Variable einzeln speichern. Was macht Anzahl dort überhaupt?<br />
Die write Funktion muß für den String auch noch verändert werden. Du brauchst ja noch die Länge vorher (hatte ich vergessen).<br />
etwa so</p>
<pre><code class="language-cpp">void Ding::write(TStream *out)
{
   int strsize =  Name.Length();
   out-&gt;Write((char*)&amp;strsize, sizeof(strsize));
   out-&gt;Write(Name.c_str(), strsize+1);
}
</code></pre>
<p>Zur Vollständigkeit noch einen Ansatz von read</p>
<pre><code class="language-cpp">void Ding::read(TStream *in)    
{
    int strsize;
    in-&gt;Read((char*)&amp;strsize, sizeof(strsize));
    char *tstr = new char[strsize+1];
    in-&gt;Read(tstr, strsize+1);
// hier fehlt jetzt noch was
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/776353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/776353</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 27 Apr 2005 07:19:19 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Wed, 27 Apr 2005 10:09:24 GMT]]></title><description><![CDATA[<p>Hallo Braunstein,</p>
<p>Deine Frage nach der Int-Variablen Anzahl: Dort soll die Anzahl des vorhandenen<br />
Dinges abgelegt werden, welches unter Name benannt ist (zb. bei einer Lagerverwaltung).</p>
<p>Ich werde mich, sobald ich Zeit habe, mit den Streams beschäftigen. Deine Hinweise sind auf alle Fälle ein guter Einstieg. Deshalb nochmal vielen Dank.</p>
<p>Meine Lösung werde ich dann hier präsentieren, vielleicht gibts ja noch den einen oder anderen Haken, den ich nicht bemerkt habe.</p>
<p>Es grüßt sehreilig</p>
<p>Uff, damit komm ich nicht klar. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> In der BCC Hilfe ist kaum was zu finden. In meinen schlauen Büchern auch nicht.<br />
Jetzt fehlt mir zuallererst ein Tip, wo ich was über TStrings nachlesen kann und wo auch ein paar Beispiele sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/776449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/776449</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Wed, 27 Apr 2005 10:09:24 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Wed, 27 Apr 2005 10:16:48 GMT]]></title><description><![CDATA[<p>Zu TStrings bzw. TStringList findest du alles Nötige in der BCB-Hilfe. Falls du mit der Hilfe nicht klar kommst, schau mal hier <a href="http://www.junix.ch/bcb/help/hilfe.html" rel="nofollow">http://www.junix.ch/bcb/help/hilfe.html</a> nach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/776504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/776504</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 27 Apr 2005 10:16:48 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Wed, 27 Apr 2005 10:18:19 GMT]]></title><description><![CDATA[<p>sehreilig schrieb:</p>
<blockquote>
<p>(zb. bei einer Lagerverwaltung).</p>
</blockquote>
<p>Falls Du wirklich Artikel und Bestände verwalten willst, solltest Du dich mal mit Datenbanken beschäftigen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/776506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/776506</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 27 Apr 2005 10:18:19 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Wed, 27 Apr 2005 11:42:23 GMT]]></title><description><![CDATA[<p>Hallo Joe_M,<br />
danke für den Hinweis.<br />
na klar, ne Lagerverwaltung mit Datenbank.<br />
Aber ich will ein kleines Projekt ganz ohne Datenbank. Gruß von sehreilig</p>
<p>Hallo Braunstein,</p>
<p>die TStringList ist nicht so ein Problem, aber die TStreams, die du anwendest.</p>
<p>Ich zeig mal hier meine nicht funktionierende Lösung.</p>
<pre><code>[cpp]
struct Ding
        {
        AnsiString Name;
        int a;
        void write(AnsiString DatName);
        void read(AnsiString DatName);
        }     ;

void Ding::write(AnsiString DatName)
{
TStringList *daten = new TStringList;
daten-&gt;Add(Name);
daten-&gt;Add(IntToStr(a));
daten-&gt;SaveToFile(DatName);
} ;

void Ding::read(AnsiString DatName)
{
TStringList *daten = new TStringList;
daten-&gt;LoadFromFile(DatName);
Name = daten-&gt;Strings[0];
a = StrToInt(daten-&gt;Strings[1]);
} ;

[/cpp]
</code></pre>
<p>Ich finde keine Möglichkeit, um zum Speichern eines Arrays die Inhalte nacheinander in eine Datei zu schreiben. Gespeichert ist immer nur das letzte Array-Element.</p>
<pre><code>[cpp]
//speichern

Ding test[5]; 
//hier folgt Schleife für Inhalte

for (int i = 0; i&lt;5; i++)
    {
    test[i].write(&quot;test.Dat&quot;) ;
    }

//lesen

Ding kurt[5];

for (int i = 0; i&lt;5; i++)
    {
    kurt[i].read(&quot;test.Dat&quot;) ;
    Label1-&gt;Caption = Label1-&gt;Caption + kurt[i].Name + &quot;  &quot; + kurt[i].a + &quot; \n&quot;;
    }
[/cpp]
</code></pre>
<p>Weshalb das so ist, ist mir klar (datei wird beim Schreiben mit jedem Schleifendurchlauf neu angelegt...) <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="😕"
    /></p>
<p>Es grüßt sehreilig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/776561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/776561</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Wed, 27 Apr 2005 11:42:23 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Wed, 27 Apr 2005 11:49:08 GMT]]></title><description><![CDATA[<p>Als Denkanstoß: Beschäftige dich lieber mal mit (Datei-)streams. (BCB-Hilfe zu TFileStream).</p>
<p>Dann kannst du ungefähr sowas machen:</p>
<pre><code>MeinStream = neuer Stream(Dateiname);
iteriere über alle Elemente
    Element.write(MeinStream);
Schließe Stream
</code></pre>
<p>Lesen sähe genauso aus.</p>
<p>/Edit: Man kann dasselbe Prinzip natürlich auch mit TStringList machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/776570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/776570</guid><dc:creator><![CDATA[Dasd]]></dc:creator><pubDate>Wed, 27 Apr 2005 11:49:08 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Wed, 27 Apr 2005 11:53:56 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4916">@Dasd</a><br />
Genau so hatte ich mir das gedacht.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6654">@sehreilig</a><br />
Irgendwie sehen meine read/write-Funktionen anders aus als deine und das hat auch seinen Grund <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 />
Bezüglich der Hilfe: die BCB-Hilfe funktioniert für TStream (oder hier besser TFileStream) genauso wie bei TStringList.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/776579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/776579</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 27 Apr 2005 11:53:56 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Wed, 27 Apr 2005 12:06:28 GMT]]></title><description><![CDATA[<p>Dachte nur es wäre 'sehreilig'. Und da verstehe ich jetzt nicht, warum Du das Rad neu erfinden willst. Unterm Strich wirst Du sehr viele Funktionen benötigen, die in einem RDBMS schon vorhanden sind...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/776593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/776593</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 27 Apr 2005 12:06:28 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Thu, 28 Apr 2005 14:42:03 GMT]]></title><description><![CDATA[<p>So, nun hab ich so viele Hinweise, jetzt werd ich mich mal reinvertiefen. Nochmals danke an alle für die Tips !</p>
<p>Grüße von sehreilig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/777629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/777629</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Thu, 28 Apr 2005 14:42:03 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Mon, 02 May 2005 18:38:12 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/780349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/780349</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Mon, 02 May 2005 18:38:12 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Tue, 03 May 2005 06:52:14 GMT]]></title><description><![CDATA[<ul>
<li>Schreib/Lese-Funktionen sind sehr unflexibel. Statt den cast nach <strong>char</strong>* solltest du direkt einen zeiger dieses typs (oder void*) der funktion übergeben (natürlich dann auch mit Grössenangabe). Damit kannst dann auch andere Daten problemlos speichern.</li>
<li>die Variable <strong>i</strong> würde ich in die Klasse nehmen und dort <strong>bool IsOpen</strong> nennen. Diese setzt du beim Öffnen der Datei auf <strong>true</strong> sonst ist sie <strong>false</strong>.</li>
<li>die Datei öffnest du mit eine separaten funktion <strong>Open</strong> damit du die nicht immer neu öffnen musst vor jeder schreib/lese-aktion (kostet zeit)</li>
<li>das filehandle kannste damit auch in die klasse packen.</li>
<li>beim lesen natürlich vorher prüfen, ob die datei auch existiert, dito für schreiben, nur das du dort fragen kannst, ob sie überschrieben werden soll.</li>
</ul>
<p>aber vielleicht überdenkst du eher noch mal dein klassendesign und speicherst die daten direkt in der klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/780663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/780663</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Tue, 03 May 2005 06:52:14 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Tue, 03 May 2005 07:36:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Warum nimmst du nicht, wie schon vorgeschlagen die TStream-Variante. Die Datei sollte sowieso außerhalb der read/write-Funktionen geöffnet (und dann auch geschlossen) werden. Wenn du unbedingt die FileOpen etc. Varianten verwenden willst, kannst du ja auch das Filehandle übergeben. So wie du es jetzt hast ist es wirklich recht unflexibel und zudem auch langsam. Das ständige Öffnen und Schließen der Dateien ist nicht so richtig gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/780684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/780684</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 03 May 2005 07:36:08 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Wed, 04 May 2005 14:46:59 GMT]]></title><description><![CDATA[<p>Hallo Sunday, hallo Braunstein,</p>
<p>vielen Dank für eure Hinweise.<br />
Ich hab zunächst einmal versucht, einige Tips in meine jetzige Lösung einzuarbeiten:</p>
<pre><code class="language-cpp">struct Ding
        {
        AnsiString Name;
        int a;
        float DM;
        int openWrite (AnsiString DatName, bool neu);
        int openRead (AnsiString DatName);
        void closeDatei( int Handle);
        void write(int oFileHandle);
        void read( int iFileHandle);

        }     ;
</code></pre>
<p>Es funktioniert auch gut. Allerdings sieht die Verwendung von openWrite,bzw openRead oder closeDatei recht unsauber aus:<br />
z.B</p>
<pre><code class="language-cpp">int Handle = test[0].openWrite(&quot;daten.txt&quot;,true);
</code></pre>
<p>Es sieht aus, als würde speziell für das Arrayelement test[0] ein Handle geholt. Das Handle gilt allerdings für alle dann folgenden Schreibaktionen.</p>
<pre><code class="language-cpp">int Handle = test[0].openWrite(&quot;daten.txt&quot;,true);
for (int i = 0; i&lt;5; i++)
    {
    test[i].write(Handle) ;
    }
test[0].closeDatei(Handle);
</code></pre>
<p>Funktioniert zwar, aber find ich nicht so schön.</p>
<p>Sunday schrieb:</p>
<blockquote>
<p>aber vielleicht überdenkst du eher noch mal dein klassendesign und speicherst die daten direkt in der klasse.</p>
</blockquote>
<p>Mir scheint tatsächlich jetzt auch, dass im Ansatz bereits die Probleme entstehen.<br />
Ich werde das Ganze jetzt einmal so angehen:</p>
<p>1. struct ding {alle Eigenschaften vom Ding};<br />
2. class DingeVerwaltung {Array mit Ding und alles zum Speichern und Laden}</p>
<p>ich glaube, dann ist die Lösung sehr viel schöner.</p>
<p>grüße von sehreilig</p>
<p>Schon Fertig:</p>
<pre><code class="language-cpp">//--------------------------------------------------------------------------
struct Ding
      {
        AnsiString Name;
        int a;
        float DM;
         }     ;

class DingeVerwalten
        {
        public:
        Ding Dinge[5];
        AnsiString DatName;

        void write();
        void read();

        }     ;
//-----------------------------------------------------------------------------

void DingeVerwalten::write()
{

 int Handle;
 Handle = FileCreate(DatName);

 for (int i =0; i&lt;5; i++)
     {

     int strsize = Dinge[i].Name.Length();

     FileWrite(Handle,(void *) &amp;strsize, sizeof(strsize)) ;
     FileWrite(Handle, Dinge[i].Name.c_str(), strsize +1);
     FileWrite(Handle, (void *) &amp;Dinge[i].a, sizeof(Dinge[i].a));
     FileWrite (Handle, (void *) &amp;Dinge[i].DM, sizeof(Dinge[i].DM));
     }
     FileClose(Handle);

} ;

//-----------------------------------------------------------------------------

void DingeVerwalten::read()
{
 int Handle = FileOpen(DatName,fmOpenRead );
 int strsize;
 for (int i = 0; i&lt;5; i++)
     {
     FileRead(Handle,(void *) &amp;strsize, sizeof(strsize));
     char *tstr= new char[strsize + 1];
     FileRead(Handle,tstr, strsize+1);
     Dinge[i].Name = AnsiString(tstr);
     FileRead(Handle,(void *) &amp;Dinge[i].a, sizeof(Dinge[i].a));
     FileRead (Handle, (void *) &amp;Dinge[i].DM, sizeof(Dinge[i].DM));
     }
  FileClose(Handle);
} ;
</code></pre>
<p>erstmal ohne Fehler abfangen.</p>
<p>Über Komentare und weitere Hinweise freue ich mich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/781692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/781692</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Wed, 04 May 2005 14:46:59 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Wed, 04 May 2005 16:07:43 GMT]]></title><description><![CDATA[<p>Der Ansatz ist schonmal in Ordnung. Nur solltest du das eigentliche Schreiben wieder zurück nach Ding verlegen (sprich: genau das, was in der for-Schleife liegt).</p>
<p>Dann erzeugst du das Handle, durchläufst die for-Schleife und gibst bei einem Dinge.write Aufruf das Handle mit.</p>
<p>Das wäre dann die Lösung die auch schon einige Seiten weiter vorne vorgeschlagen wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/781763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/781763</guid><dc:creator><![CDATA[Dasd]]></dc:creator><pubDate>Wed, 04 May 2005 16:07:43 GMT</pubDate></item><item><title><![CDATA[Reply to Structure-array speichern on Fri, 06 May 2005 14:51:07 GMT]]></title><description><![CDATA[<p>Hallo Dasd,<br />
danke für deinen Hinweis.<br />
Jetzt sieht das ganze so aus und funktioniert wirklich gut:</p>
<pre><code class="language-cpp">struct Ding
      {
        AnsiString Name;
        int a;
        float DM;
        void write( int Handle);
        void read (int Handle);
         }     ;

class DingeVerwalten
        {
        public:
        Ding Dinge[5];
        AnsiString DatName;

        void write();
        void read();

        }     ;
</code></pre>
<p>Du und Braunstein bevorzugen wohl allerdings eine TStream-Variante.<br />
Bei meinen Ausflügen durch die Borland-Hilfe fand ich zu meiner jetzigen Lösung viele Hinweise, so kam es zu dieser Lösung. An der Klassenstruktur wird sich vermutlich mit TStreams nicht viel ändern.</p>
<p>Wieso sind TStreams besser geeignet? Was meint Sunday damit:</p>
<blockquote>
<p>Schreib/Lese-Funktionen sind sehr unflexibel.</p>
</blockquote>
<p>Über eine Antwort würde ich mich freuen.</p>
<p>Nochmals allen vielen Dank. Grüße von sehr eilig</p>
<p>Inzwischen hab ich auch eine Variante mit TStreams erprobt.<br />
Ich muss sagen: Ich bin jetzt sehr zufrieden, meine anfängliche Problem sind durch die Unterstützung hier im Forum voll gelöst ! Zusätzlich hab ich einiges durch eure Tips dazugelernt, was mir alleine aus dem Erarbeiten aus Büchern oder aus der Hilfe kaum möglich gewesen wäre. SUPER <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/781911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/781911</guid><dc:creator><![CDATA[sehreilig]]></dc:creator><pubDate>Fri, 06 May 2005 14:51:07 GMT</pubDate></item></channel></rss>