<?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[Binär dateien in einer std::list?]]></title><description><![CDATA[<p>Hey @all,</p>
<p>ich habe vor text informationen, und jetzt auch bild informationen zu lesen, und dieser in einem eigenen Dateiformat zu speichern.</p>
<p>Mein Problem liegt eigentlich nur an den Binär dateien. sei es PDF oder jpg, oder was auch immer.</p>
<p>ich würde die Dateien wie folgt einlesen:</p>
<pre><code class="language-cpp">struct FileContent {
	std::string content;
	unsigned int content_size;
};

std::map&lt;int, std::list&lt;FileContent&gt; &gt; ml;
std::list&lt;FileContent&gt; sl;

fstream file(input_filename, ios::in | ios::binary);
char buffer[1024];
while(file.read(buffer, 1024)) {
	struct FileContent fc;
	memset(&amp;fc, '\0', sizeof(fc));

	memset(&amp;buffer, '\0', 1024);
	file.read(buffer, 1024);
	fc.content.append(buffer, file.gcount());
	fc.content_size = file.gcount();
	sl.push_back(fc);
}
m[0] = sl;
</code></pre>
<p>Das schreiben der dateien würde wieder wie folgt aussehen:</p>
<pre><code class="language-cpp">fstream file(output_filename, ios::out | ios::binary);
for(std::map&lt;int, std::list&lt;FileContent&gt; &gt;::iterator mlIter = ml.begin(); mlIter != ml.end(); ++mlIter) {
	for(std::list&lt;FileContent&gt;::iterator slIter = (*mlIter).second.begin(); slIter != (*mlIter).second.end(); ++slIter) {
		unsigned int size = (*slIter).content_size;
		file.write(reinterpret_cast&lt;const char*&gt;(&amp;(*slIter).content), (*slIter).content_size);
	}
}
file.close();
</code></pre>
<p>Mein Problem ist nun das er entweder nicht richtig liest bzw. nicht richtig schreibt. Habe das ganze mal mit einem simplen bild ausprobiert. nur meine geschriebene Version lässt sich nicht mehr öffnen.</p>
<p>Hat jemand rat?</p>
<p>Vor hätte ich das ich beispielsweise normale benutzer informationen speichern kann (Name, Geburtsdatum usw.) und dann eventuell noch ein Bild des benutzers.</p>
<p>Lg freeze</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/172880/binär-dateien-in-einer-std-list</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 01:51:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/172880.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Feb 2007 10:20:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Binär dateien in einer std::list? on Fri, 09 Feb 2007 10:20:48 GMT]]></title><description><![CDATA[<p>Hey @all,</p>
<p>ich habe vor text informationen, und jetzt auch bild informationen zu lesen, und dieser in einem eigenen Dateiformat zu speichern.</p>
<p>Mein Problem liegt eigentlich nur an den Binär dateien. sei es PDF oder jpg, oder was auch immer.</p>
<p>ich würde die Dateien wie folgt einlesen:</p>
<pre><code class="language-cpp">struct FileContent {
	std::string content;
	unsigned int content_size;
};

std::map&lt;int, std::list&lt;FileContent&gt; &gt; ml;
std::list&lt;FileContent&gt; sl;

fstream file(input_filename, ios::in | ios::binary);
char buffer[1024];
while(file.read(buffer, 1024)) {
	struct FileContent fc;
	memset(&amp;fc, '\0', sizeof(fc));

	memset(&amp;buffer, '\0', 1024);
	file.read(buffer, 1024);
	fc.content.append(buffer, file.gcount());
	fc.content_size = file.gcount();
	sl.push_back(fc);
}
m[0] = sl;
</code></pre>
<p>Das schreiben der dateien würde wieder wie folgt aussehen:</p>
<pre><code class="language-cpp">fstream file(output_filename, ios::out | ios::binary);
for(std::map&lt;int, std::list&lt;FileContent&gt; &gt;::iterator mlIter = ml.begin(); mlIter != ml.end(); ++mlIter) {
	for(std::list&lt;FileContent&gt;::iterator slIter = (*mlIter).second.begin(); slIter != (*mlIter).second.end(); ++slIter) {
		unsigned int size = (*slIter).content_size;
		file.write(reinterpret_cast&lt;const char*&gt;(&amp;(*slIter).content), (*slIter).content_size);
	}
}
file.close();
</code></pre>
<p>Mein Problem ist nun das er entweder nicht richtig liest bzw. nicht richtig schreibt. Habe das ganze mal mit einem simplen bild ausprobiert. nur meine geschriebene Version lässt sich nicht mehr öffnen.</p>
<p>Hat jemand rat?</p>
<p>Vor hätte ich das ich beispielsweise normale benutzer informationen speichern kann (Name, Geburtsdatum usw.) und dann eventuell noch ein Bild des benutzers.</p>
<p>Lg freeze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225556</guid><dc:creator><![CDATA[_freeze_]]></dc:creator><pubDate>Fri, 09 Feb 2007 10:20:48 GMT</pubDate></item><item><title><![CDATA[Reply to Binär dateien in einer std::list? on Fri, 09 Feb 2007 10:37:13 GMT]]></title><description><![CDATA[<p><em>freeze</em> schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct FileContent {
	std::string content;
	unsigned int content_size;
};

...
struct FileContent fc;
memset(&amp;fc, '\0', sizeof(fc));
...
</code></pre>
</blockquote>
<p>Das ist ganz übel - mit dem memset() überschreibst du die Kontrollinformationen des Strings 'content', danach kannst du nicht mehr vorhersagen, wie er sich verhalten wird.<br />
(Merke: Greife <strong>niemals</strong> über Low-Level-Funktionen (wie memset()) auf voll ausgewachsene Klassenobjekte zu - damit umgehst du die Datenkapselung von C++ und zerstörst im Ernstfal wichtige Invarianten der Klasse)</p>
<p>Der zweite (logische) Fehler in deinem Code ist, daß gcount() nur die Zeichenzahl aus dem letzten read()-Befehl zurückgibt. Das heißt, dein fc.content_size enthält eine zu kleine Größenangabe.<br />
(btw, content_size benötigst du überhaupt nicht - an die <em>tatsächliche</em> Größe der eingelesenen Datei kommst du per <code>fc.content.size()</code> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225570</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 09 Feb 2007 10:37:13 GMT</pubDate></item><item><title><![CDATA[Reply to Binär dateien in einer std::list? on Fri, 09 Feb 2007 10:58:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>also ich habe das jetzt mal so umgeschrieben</p>
<pre><code class="language-cpp">char buffer[1024];
while(file.read(buffer, 1024)) {
	struct FileContent fc;

	memset(&amp;buffer, '\0', 1024);
	file.read(buffer, 1024); 
	fc.content = buffer; //.append(buffer, file.gcount());
	//fc.content_size = file.gcount();
	sl.push_back(fc);
}
ml[0] = sl;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">fstream file(output_filename, ios::out | ios::binary);
for(std::map&lt;int, std::list&lt;FileContent&gt; &gt;::iterator mlIter = ml.begin(); mlIter != ml.end(); ++mlIter) {
    for(std::list&lt;FileContent&gt;::iterator slIter = (*mlIter).second.begin(); slIter != (*mlIter).second.end(); ++slIter) {
        unsigned int size = (*slIter).content_size;
        file.write(reinterpret_cast&lt;const char*&gt;(&amp;(*slIter).content), (*slIter).content.size());
    }
}
file.close();
</code></pre>
<p>Jetzt wird die zu schreibende Datei aber noch kleiner <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Ich komme einfach nicht auf das Problem</p>
<p>Lg freeze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225593</guid><dc:creator><![CDATA[_freeze_]]></dc:creator><pubDate>Fri, 09 Feb 2007 10:58:17 GMT</pubDate></item><item><title><![CDATA[Reply to Binär dateien in einer std::list? on Fri, 09 Feb 2007 11:11:15 GMT]]></title><description><![CDATA[<p>Erstens: std::string interpretiert das \0 (was in binären Daten durchaus vorkommen kann) als String-Ende, außer du gibst die Datengröße explizit vor:</p>
<pre><code class="language-cpp">fc.content.assign(buffer,file.gcount);
</code></pre>
<p>Zweitens: Wenn du einen string per reinterpret_cast als char-Array uminterpretierst, bekommst du nur Müll heraus. Für die Umwandlung, die du suchst, hat string die Methode c_str() oder data():</p>
<pre><code class="language-cpp">file.write(slIter-&gt;content.data(), slIter-&gt;content.size());
</code></pre>
<p>PS: Die STL-Iteratoren haben auch op-&gt; überladen, da kannst du statt (*Iter).irgendwas auch Iter-&gt;irgendwas schreiben (letzteres sieht imho übersichtlicher aus).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225606</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 09 Feb 2007 11:11:15 GMT</pubDate></item></channel></rss>