<?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[EAccessViolation beim lesen von Daten und schließen der Anwendung]]></title><description><![CDATA[<p>Einen schönen guten Tag an alle. Ich schreibe ein Programm zum Lesen und Schreiben von Daten. Wenn ich nun mit dem Programm Daten geschrieben habe und es wieder Schließe bekomme ich eine EAccessViolation. Beim einlesen der Daten das gleiche. Nur das ich da bereits beim 2ten Einlesen eine Fehlermeldung bekomme. Ich befürchte ich gebe irgendeinen Speicher nicht frei aber welchen?</p>
<p>hier der Quellcode:</p>
<pre><code class="language-cpp">int filesize(int te )
{
	struct stat datei_infos;
	char* pcDatei = &quot;festelaenge.bin&quot;;

	if ( 0 != stat( pcDatei, &amp;datei_infos ) ) return 0;
	else return datei_infos.st_size;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 fstream fileout;

//Die Datei wird zum schreiben geöffnet (ios::out)
//Die Datei ist eine Binärdatei (ios::binary)
//neu Daten werden an das ende der Datei geschrieben. (ios::app)
//int *crypt =
fileout.open(&quot;festelaenge.bin&quot;, ios::out|ios::binary|ios::app);
	char   *buffer1 = new char[40];
			buffer1 = Edit1-&gt;Text.c_str();

	if (Edit1-&gt;Text.Length()&lt;40) {
		for (int i=Edit1-&gt;Text.Length() ; i &lt;= 40; i++) {
		buffer1[i]= char(0);
		}
	}

	fileout.write(buffer1,40*sizeof(char));

	char   *buffer2 = new char(40);
			buffer2 = Edit2-&gt;Text.c_str();

	if (Edit2-&gt;Text.Length()&lt;40) {
		for (int i=Edit2-&gt;Text.Length() ; i &lt;= 40; i++) {
		buffer2[i]= char(0);
		}
	}
	fileout.write(buffer2,40*sizeof(char));

	int buffer3 = StrToInt(Edit3-&gt;Text);

	fileout.write( (char*)&amp;buffer3,sizeof(int));
fileout.close();
delete buffer1;
delete buffer2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
using namespace std;
fstream FileBin;
	int nn 	= filesize(1);
	int f 	= 40;
	int g 	=  4;
		nn  = (nn / ((2*f)+g))+1;
	int an;
	int bn;
	int cn;

char *Feldname		= new char(40);
char *Feldtype		= new char(40);
int  Feldlaenge;
FileBin.open(&quot;festelaenge.bin&quot;, ios::in|ios::binary);
for (int n = 1; n &lt;= nn-1; n++) {
	an = ((( 2 * f + g)*(n-1)));
	FileBin.seekg(an, ios::beg);
	FileBin.read(Feldname,40);
	StringGrid1-&gt;Cells[1][n]=(an);
	StringGrid1-&gt;Cells[2][n]=Feldname;
	bn = ((( 2 * f + g)*(n-1))+(f));
	FileBin.seekg(bn, ios::beg);
	FileBin.read(Feldtype,40);
	StringGrid1-&gt;Cells[3][n]=(bn);
	StringGrid1-&gt;Cells[4][n]=Feldtype;
	cn = ((( 2 * f + g)*(n-1))+(2*f));
	FileBin.seekg(cn, ios::beg);
	FileBin.read( (char*)&amp;Feldlaenge, sizeof(int));
	StringGrid1-&gt;Cells[5][n]=(cn);
	StringGrid1-&gt;Cells[6][n]=IntToStr(Feldlaenge);
 }
FileBin.close();
delete Feldname;
//delete Feldtype; &lt;-- Wenn ich diese Zeile activ habe wirft er direkt eine                 EAccessViolation was ich nicht ganz verstehe da ich ja den Speicher wieder Freigeben muss.
}
</code></pre>
<p>Ich bin Kurz vorm verzweifeln und finde den verdammten Fehler nicht. Ach ja beim lesen entsteht der Fehler sobald ich die Datei nochmals öffnen will.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/181612/eaccessviolation-beim-lesen-von-daten-und-schließen-der-anwendung</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 19:11:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/181612.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 May 2007 15:05:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to EAccessViolation beim lesen von Daten und schließen der Anwendung on Tue, 15 May 2007 15:06:04 GMT]]></title><description><![CDATA[<p>Einen schönen guten Tag an alle. Ich schreibe ein Programm zum Lesen und Schreiben von Daten. Wenn ich nun mit dem Programm Daten geschrieben habe und es wieder Schließe bekomme ich eine EAccessViolation. Beim einlesen der Daten das gleiche. Nur das ich da bereits beim 2ten Einlesen eine Fehlermeldung bekomme. Ich befürchte ich gebe irgendeinen Speicher nicht frei aber welchen?</p>
<p>hier der Quellcode:</p>
<pre><code class="language-cpp">int filesize(int te )
{
	struct stat datei_infos;
	char* pcDatei = &quot;festelaenge.bin&quot;;

	if ( 0 != stat( pcDatei, &amp;datei_infos ) ) return 0;
	else return datei_infos.st_size;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 fstream fileout;

//Die Datei wird zum schreiben geöffnet (ios::out)
//Die Datei ist eine Binärdatei (ios::binary)
//neu Daten werden an das ende der Datei geschrieben. (ios::app)
//int *crypt =
fileout.open(&quot;festelaenge.bin&quot;, ios::out|ios::binary|ios::app);
	char   *buffer1 = new char[40];
			buffer1 = Edit1-&gt;Text.c_str();

	if (Edit1-&gt;Text.Length()&lt;40) {
		for (int i=Edit1-&gt;Text.Length() ; i &lt;= 40; i++) {
		buffer1[i]= char(0);
		}
	}

	fileout.write(buffer1,40*sizeof(char));

	char   *buffer2 = new char(40);
			buffer2 = Edit2-&gt;Text.c_str();

	if (Edit2-&gt;Text.Length()&lt;40) {
		for (int i=Edit2-&gt;Text.Length() ; i &lt;= 40; i++) {
		buffer2[i]= char(0);
		}
	}
	fileout.write(buffer2,40*sizeof(char));

	int buffer3 = StrToInt(Edit3-&gt;Text);

	fileout.write( (char*)&amp;buffer3,sizeof(int));
fileout.close();
delete buffer1;
delete buffer2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
using namespace std;
fstream FileBin;
	int nn 	= filesize(1);
	int f 	= 40;
	int g 	=  4;
		nn  = (nn / ((2*f)+g))+1;
	int an;
	int bn;
	int cn;

char *Feldname		= new char(40);
char *Feldtype		= new char(40);
int  Feldlaenge;
FileBin.open(&quot;festelaenge.bin&quot;, ios::in|ios::binary);
for (int n = 1; n &lt;= nn-1; n++) {
	an = ((( 2 * f + g)*(n-1)));
	FileBin.seekg(an, ios::beg);
	FileBin.read(Feldname,40);
	StringGrid1-&gt;Cells[1][n]=(an);
	StringGrid1-&gt;Cells[2][n]=Feldname;
	bn = ((( 2 * f + g)*(n-1))+(f));
	FileBin.seekg(bn, ios::beg);
	FileBin.read(Feldtype,40);
	StringGrid1-&gt;Cells[3][n]=(bn);
	StringGrid1-&gt;Cells[4][n]=Feldtype;
	cn = ((( 2 * f + g)*(n-1))+(2*f));
	FileBin.seekg(cn, ios::beg);
	FileBin.read( (char*)&amp;Feldlaenge, sizeof(int));
	StringGrid1-&gt;Cells[5][n]=(cn);
	StringGrid1-&gt;Cells[6][n]=IntToStr(Feldlaenge);
 }
FileBin.close();
delete Feldname;
//delete Feldtype; &lt;-- Wenn ich diese Zeile activ habe wirft er direkt eine                 EAccessViolation was ich nicht ganz verstehe da ich ja den Speicher wieder Freigeben muss.
}
</code></pre>
<p>Ich bin Kurz vorm verzweifeln und finde den verdammten Fehler nicht. Ach ja beim lesen entsteht der Fehler sobald ich die Datei nochmals öffnen will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285468</guid><dc:creator><![CDATA[S.Fiege]]></dc:creator><pubDate>Tue, 15 May 2007 15:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to EAccessViolation beim lesen von Daten und schließen der Anwendung on Tue, 15 May 2007 15:40:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe mir jetzt nicht alles angeschaut, mir fällt aber auf Anhieb das hier auf</p>
<pre><code class="language-cpp">char   *buffer1 = new char[40]; //Speicher für 40 chars reservieren
            buffer1 = Edit1-&gt;Text.c_str(); // Zeiger wieder überschreiben (Speicherleck!)
</code></pre>
<p>Hiermit erzeugst du schonmal ein Speicherleck. Außerdem gibt c_str() ein const char* zurück welches einen Zeiger auf den internen Speicher eines AnsiStrings ist. Den darfst du niemals beschreiben!<br />
Du kannst hier für buffer1 und buffer2 gleich AnsiStrings nehmen.</p>
<pre><code class="language-cpp">fileout.open(&quot;festelaenge.bin&quot;, ios::out|ios::binary|ios::app);
    fileout.write(Edit1-&gt;Text.c_str(),40*sizeof(char));
    fileout.write(Edit1-&gt;Text.c_str(),40*sizeof(char));
    int buffer3 = StrToInt(Edit3-&gt;Text);
    fileout.write( (const char*)&amp;buffer3,sizeof(int));
fileout.close();
}
</code></pre>
<p>Dann das hier</p>
<pre><code class="language-cpp">char *Feldname        = new char(40);
</code></pre>
<p>Feldname ist ein Zeiger auf ein einzelnes char (kein Array) welches den Wert 40 enthält.<br />
besser</p>
<pre><code class="language-cpp">char *Feldname        = new char[40];
</code></pre>
<p>Weiter habe ich erstmal nicht nachgeschaut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285508</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 15 May 2007 15:40:38 GMT</pubDate></item><item><title><![CDATA[Reply to EAccessViolation beim lesen von Daten und schließen der Anwendung on Tue, 15 May 2007 16:48:21 GMT]]></title><description><![CDATA[<p>char[40] hat nur Platz für 39 Zeichen, ein Byte wird für die Null-Terminierung &quot;verbraucht&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285589</guid><dc:creator><![CDATA[Jansen]]></dc:creator><pubDate>Tue, 15 May 2007 16:48:21 GMT</pubDate></item><item><title><![CDATA[Reply to EAccessViolation beim lesen von Daten und schließen der Anwendung on Tue, 15 May 2007 19:48:18 GMT]]></title><description><![CDATA[<p>Ok das mit den eckigen Klammern war es, naja mit den Zeigern das blicke ich noch nicht ganz ich habe es zwar inhaltlich verstanden aber naja wann was wie sein muss verwechsele ich manchmal. Bin noch neu in C++.<br />
Was deine Anregung mit c_str() angeht wäre das doch nur eine Verkürzung des Quelltextes aber damit kann ich ja kein char(0) mehr anhängen siehe die for schleife. Welche ja nur den String verlängert so das er beim speichern immer 40 Zeichen hat.</p>
<p>War es nicht bei char Arrays so dass es bei 0 beginnt? wenn ich mit Haltepunkten arbeite und mir die Werte des Arrays ansehe dann ist der erste Buchstabe in [0] und nicht in [1]. Demzufolge wäre es dann doch 41 Zeichen die in dem Array stehen können und Somit Das null terminierte die 41. Ist das richtig so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285751</guid><dc:creator><![CDATA[S.Fiege]]></dc:creator><pubDate>Tue, 15 May 2007 19:48:18 GMT</pubDate></item><item><title><![CDATA[Reply to EAccessViolation beim lesen von Daten und schließen der Anwendung on Tue, 15 May 2007 19:53:20 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ein Array x[40] hat 40 Elemente die von 0 bis 39 durchnummeriert sind. Und bei C-Strings ist per Definition das letzte Zeichen ein 0. Das bedeutet das<br />
char[40] genau 39 gültige Zeichen aufnehmen kann, weil das 40. für 0 gebraucht wird.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285759</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 15 May 2007 19:53:20 GMT</pubDate></item><item><title><![CDATA[Reply to EAccessViolation beim lesen von Daten und schließen der Anwendung on Tue, 15 May 2007 19:56:34 GMT]]></title><description><![CDATA[<p>Ganz schön verwirrend nagut dann muss ich also 41 machen danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285763</guid><dc:creator><![CDATA[S.Fiege]]></dc:creator><pubDate>Tue, 15 May 2007 19:56:34 GMT</pubDate></item><item><title><![CDATA[Reply to EAccessViolation beim lesen von Daten und schließen der Anwendung on Wed, 16 May 2007 07:46:47 GMT]]></title><description><![CDATA[<p>S.Fiege schrieb:</p>
<blockquote>
<p>Was deine Anregung mit c_str() angeht wäre das doch nur eine Verkürzung des Quelltextes aber damit kann ich ja kein char(0) mehr anhängen siehe die for schleife. Welche ja nur den String verlängert so das er beim speichern immer 40 Zeichen hat.</p>
</blockquote>
<p>Du brauchst doch bei deiner Art des Einlesens überhaupt keine 0 vor dem Rausschreiben anhängen da du ohnehin genau 40 Zeichen einliest. Beim Einlesen mußt du natürlich als 41s Zeichen eine 0 anhängen.<br />
Außerdem ist mein Code nicht nur eine Verkürzung, sondern auch eine Berichtigung, da du ja 1. ein Speicherleck erzeugst, 2. in den geschützten Speicher eines Ansistrings schreiben willst und 3. dies in deinem Fall sogar auf einen temporären AnsiString machst (Text von TEdit ist eine Eigenschaft, keine Variable). Wenn du schon unbedingt dort einen Puffer verwenden willst, mußt du schon mit strncpy kopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285907</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 16 May 2007 07:46:47 GMT</pubDate></item></channel></rss>