<?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[Öffnungsmodus einer Datei (schnell) ändern]]></title><description><![CDATA[<p>Hallo,</p>
<p>in meinem Projekt erzeuge ich ein Textdatei (CFile::modeText). Am ende dieser Textdatei füge ich allerdings noch eine Zahl (UINT) an. Das sieht etwa so aus:</p>
<pre><code class="language-cpp">//Zieldatei ist vom Typ CStdioFile
if(offen)
{
	CString AlsText;
	UINT InhaltsverzeichnisPosition = (UINT)Zieldatei.SeekToEnd();  //position merken wo das Inhaltsverzeichnis beginnt

	AlsText = _def_Inhaltsverzeichnis;   //_def_Inhaltsverzeichnis = &quot;//INHALTSVERZEICHNIS//
	AlsText += &quot;\n&quot;;
	Zieldatei.WriteString(AlsText);

	//Inhaltsverzeichnis in die Datei schreiben
	for (int i = 0; i &lt; Inhaltsverzeichnis.GetSize(); i++)
	{
		Zieldatei.WriteString(Inhaltsverzeichnis[i] + &quot;\n&quot;);
	}

	//Position des Inhaltsverzeichnisses ans ende der Datei ranhängen
	Zieldatei.Write(&amp;InhaltsverzeichnisPosition, sizeof(UINT));
</code></pre>
<p>Der Trick ist ganz einfach. Sobald ich die Datei wieder öffne brauche ich (eigentlich) nur die letzen 4 Byte auslesen um die Startposition meines Inhaltsverzeichnisses innerhalb der Datei zu erhalten. Damit kann ich dann im nächsten Schritt das Inhaltsverzeichniss auslesen und auf beliebige stellen innerhalb meiner Datei zugreifen. Das hat bis jetzt auch immer super geklappt.</p>
<p>Allerdings (wie der Zufall es so will) wurde jetzt mal eine Datei erzeugt, bei der das Auslesen der letzten 4 Byte <strong>nicht</strong> mehr den Originalen UINT wert liefert.</p>
<p>Das auslesen funktioniert wie gefolgt:</p>
<pre><code class="language-cpp">if(DateiExistiert(Quelldateipfad))
{
	CStdioFile	Quelldatei;
	UINT		*StartByteInhaltsverzeichnis = new UINT(0);
	BOOL b_Erfolg;

	Quelldatei.Open(Quelldateipfad, CFile::modeRead | CFile::typeText | CFile::shareDenyWrite);

	Quelldatei.Seek( Quelldatei.GetLength() - sizeof(UINT), CFile::begin);
	Quelldatei.Read( StartByteInhaltsverzeichnis, sizeof(UINT));	//&lt;-- erhält hier schon den falschen wert
	Quelldatei.Seek(*StartByteInhaltsverzeichnis, CFile::begin);

//code welcher das Inhaltsverzeichnis ausliest
}
</code></pre>
<p>An der markierten Stelle bekomme ich also einen Wert der sich wohl nicht im ASCII Zeichensatz darstellen lässt und somit funktioniert auch der letzte Seek() Befehl nicht mehr.</p>
<p>Mir fällt dabei nur eine Lösung ein. Vor dem Schreiben und Auslesen der Inhaltsverzeichnisposition (tolles Wort <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ) müsste ich den Schreibmodus kurz auf CFile::typeBinary umstellen. Aber wie kann man das anstellen? Ich habe jedenfalls keine Funktion in der CStdioFile Klasse gefunden mit der dies möglich wäre.</p>
<p>Hab ich also nur die Wahl die Datei zu schließen, neu zu öffen (Binär), dann wieder zu schließen und wieder zu öffnen (Text)?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/145462/öffnungsmodus-einer-datei-schnell-ändern</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 02:13:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/145462.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Apr 2006 08:13:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Öffnungsmodus einer Datei (schnell) ändern on Fri, 28 Apr 2006 08:24:19 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>in meinem Projekt erzeuge ich ein Textdatei (CFile::modeText). Am ende dieser Textdatei füge ich allerdings noch eine Zahl (UINT) an. Das sieht etwa so aus:</p>
<pre><code class="language-cpp">//Zieldatei ist vom Typ CStdioFile
if(offen)
{
	CString AlsText;
	UINT InhaltsverzeichnisPosition = (UINT)Zieldatei.SeekToEnd();  //position merken wo das Inhaltsverzeichnis beginnt

	AlsText = _def_Inhaltsverzeichnis;   //_def_Inhaltsverzeichnis = &quot;//INHALTSVERZEICHNIS//
	AlsText += &quot;\n&quot;;
	Zieldatei.WriteString(AlsText);

	//Inhaltsverzeichnis in die Datei schreiben
	for (int i = 0; i &lt; Inhaltsverzeichnis.GetSize(); i++)
	{
		Zieldatei.WriteString(Inhaltsverzeichnis[i] + &quot;\n&quot;);
	}

	//Position des Inhaltsverzeichnisses ans ende der Datei ranhängen
	Zieldatei.Write(&amp;InhaltsverzeichnisPosition, sizeof(UINT));
</code></pre>
<p>Der Trick ist ganz einfach. Sobald ich die Datei wieder öffne brauche ich (eigentlich) nur die letzen 4 Byte auslesen um die Startposition meines Inhaltsverzeichnisses innerhalb der Datei zu erhalten. Damit kann ich dann im nächsten Schritt das Inhaltsverzeichniss auslesen und auf beliebige stellen innerhalb meiner Datei zugreifen. Das hat bis jetzt auch immer super geklappt.</p>
<p>Allerdings (wie der Zufall es so will) wurde jetzt mal eine Datei erzeugt, bei der das Auslesen der letzten 4 Byte <strong>nicht</strong> mehr den Originalen UINT wert liefert.</p>
<p>Das auslesen funktioniert wie gefolgt:</p>
<pre><code class="language-cpp">if(DateiExistiert(Quelldateipfad))
{
	CStdioFile	Quelldatei;
	UINT		*StartByteInhaltsverzeichnis = new UINT(0);
	BOOL b_Erfolg;

	Quelldatei.Open(Quelldateipfad, CFile::modeRead | CFile::typeText | CFile::shareDenyWrite);

	Quelldatei.Seek( Quelldatei.GetLength() - sizeof(UINT), CFile::begin);
	Quelldatei.Read( StartByteInhaltsverzeichnis, sizeof(UINT));	//&lt;-- erhält hier schon den falschen wert
	Quelldatei.Seek(*StartByteInhaltsverzeichnis, CFile::begin);

//code welcher das Inhaltsverzeichnis ausliest
}
</code></pre>
<p>An der markierten Stelle bekomme ich also einen Wert der sich wohl nicht im ASCII Zeichensatz darstellen lässt und somit funktioniert auch der letzte Seek() Befehl nicht mehr.</p>
<p>Mir fällt dabei nur eine Lösung ein. Vor dem Schreiben und Auslesen der Inhaltsverzeichnisposition (tolles Wort <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ) müsste ich den Schreibmodus kurz auf CFile::typeBinary umstellen. Aber wie kann man das anstellen? Ich habe jedenfalls keine Funktion in der CStdioFile Klasse gefunden mit der dies möglich wäre.</p>
<p>Hab ich also nur die Wahl die Datei zu schließen, neu zu öffen (Binär), dann wieder zu schließen und wieder zu öffnen (Text)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1046896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1046896</guid><dc:creator><![CDATA[Chris++ 0]]></dc:creator><pubDate>Fri, 28 Apr 2006 08:24:19 GMT</pubDate></item><item><title><![CDATA[Reply to Öffnungsmodus einer Datei (schnell) ändern on Fri, 28 Apr 2006 08:23:21 GMT]]></title><description><![CDATA[<p>Hmm, da fällt mir auf Anhieb nur ein, die Datei über ein zweites CFile im Binärmodus zu öffnen.</p>
<p>Plan B: du arbeitest rein im Binärmodus und kümmerst dich von Hand darum, daß \n korrekt weiterverarbeitet wird.</p>
<p>Plan C: du maskierst die eingetragene Zielposition so, daß kein \n-Byte drin vorkommen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1046898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1046898</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 28 Apr 2006 08:23:21 GMT</pubDate></item><item><title><![CDATA[Reply to Öffnungsmodus einer Datei (schnell) ändern on Fri, 28 Apr 2006 08:27:38 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Hmm, da fällt mir auf Anhieb nur ein, die Datei über ein zweites CFile im Binärmodus zu öffnen.</p>
</blockquote>
<p>Das werde ich machen. Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1046901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1046901</guid><dc:creator><![CDATA[Chris++ 0]]></dc:creator><pubDate>Fri, 28 Apr 2006 08:27:38 GMT</pubDate></item><item><title><![CDATA[Reply to Öffnungsmodus einer Datei (schnell) ändern on Fri, 28 Apr 2006 08:35:07 GMT]]></title><description><![CDATA[<p>Ein CStdioFile ist ja ein normales CRT file, das mit fopen geöffnet wurde.<br />
Der FILE* ist in CStdioFile::m_pStream verfügbar.<br />
Mit _fileno besorgst Du Dir den CRT File Descriptor und mit _setmode wechselst Du auf den Mode _O_BINARY.<br />
Sollte gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1046904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1046904</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 28 Apr 2006 08:35:07 GMT</pubDate></item></channel></rss>