<?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ärfile in vector&amp;lt;unsigned char&amp;gt; einlesen]]></title><description><![CDATA[<p>Hiho,<br />
ich habe eine Frage:<br />
Gibt es eine effiziente Möglichkeit, eine Binärfile in einen std::vector&lt;unsigned char&gt; einzulesen?<br />
Bislang mache ich dies wie folgt</p>
<pre><code class="language-cpp">std::fstream stream( fileName, std::ios::in | std::ios::binary );
if( !stream )
//Fehlerbehandlung + return

//nur zur Beschleunigung im Debug
size_t start = stream.tellg();
stream.seekg( 0, std::ios::end );
size_t end = stream.tellg();
steam.seekg( 0, std::ios::beg );
size_t size = end - start;

char temp;
unsigned char * pVals = new unsigned char[size + 1];

for( int i = 0; stream; ++i )
{
    stream.get( temp );
    pVals[i] = (unsigned char) temp;
}

std::vector&lt;unsigned char&gt; vec( pVals, pVals + size );
delete [] pVals;
pVals = NULL;
</code></pre>
<p>Das Ganze mit dem Array ist eigentlich lediglich für die Beschleunigung des IOs im Debug Modus, da ein Vektor im Debug ziemlich viel Overhead erzeugt und von daher große Wartezeiten vorhanden sind, im Release wird das Ganze vermutlich geändert.<br />
Gibt es irgendwie eine schöne(re)/schnelle(re) Möglichkeit das Ganze zu bauen, oder ist dies eine der wenigen Möglchkeiten?<br />
thx so far</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/206002/binärfile-in-vector-lt-unsigned-char-gt-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 01:00:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206002.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 20 Feb 2008 10:44:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Binärfile in vector&amp;lt;unsigned char&amp;gt; einlesen on Wed, 20 Feb 2008 10:44:21 GMT]]></title><description><![CDATA[<p>Hiho,<br />
ich habe eine Frage:<br />
Gibt es eine effiziente Möglichkeit, eine Binärfile in einen std::vector&lt;unsigned char&gt; einzulesen?<br />
Bislang mache ich dies wie folgt</p>
<pre><code class="language-cpp">std::fstream stream( fileName, std::ios::in | std::ios::binary );
if( !stream )
//Fehlerbehandlung + return

//nur zur Beschleunigung im Debug
size_t start = stream.tellg();
stream.seekg( 0, std::ios::end );
size_t end = stream.tellg();
steam.seekg( 0, std::ios::beg );
size_t size = end - start;

char temp;
unsigned char * pVals = new unsigned char[size + 1];

for( int i = 0; stream; ++i )
{
    stream.get( temp );
    pVals[i] = (unsigned char) temp;
}

std::vector&lt;unsigned char&gt; vec( pVals, pVals + size );
delete [] pVals;
pVals = NULL;
</code></pre>
<p>Das Ganze mit dem Array ist eigentlich lediglich für die Beschleunigung des IOs im Debug Modus, da ein Vektor im Debug ziemlich viel Overhead erzeugt und von daher große Wartezeiten vorhanden sind, im Release wird das Ganze vermutlich geändert.<br />
Gibt es irgendwie eine schöne(re)/schnelle(re) Möglichkeit das Ganze zu bauen, oder ist dies eine der wenigen Möglchkeiten?<br />
thx so far</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459321</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Wed, 20 Feb 2008 10:44:21 GMT</pubDate></item><item><title><![CDATA[Reply to Binärfile in vector&amp;lt;unsigned char&amp;gt; einlesen on Wed, 20 Feb 2008 10:52:10 GMT]]></title><description><![CDATA[<p>1. Den Zwischenschritt über pTemp brauchst Du nicht. Du kannst auch direkt in pVals[i] einlesen.</p>
<p>2. Den Zwischenschritt über pVals brauchst Du aber auch nicht. Lies direkt in die Vectorelemente ein.</p>
<p>3. Mit einem istreambuf_iterator kannst Du - meine ich - auch direkt die Datei in den Vector &quot;kopieren&quot;.</p>
<pre><code class="language-cpp">vector&lt;unsigned char&gt; vec( (istreambuf_iterator&lt;char&gt;(stream)), istreambuf_iterator&lt;char&gt;());
</code></pre>
<p>Beachte die zusätzlichen Klammern um das erste Argument. Sonst hast Du hinterher eine Funktion und keinen Vector <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1459327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459327</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 20 Feb 2008 10:52:10 GMT</pubDate></item><item><title><![CDATA[Reply to Binärfile in vector&amp;lt;unsigned char&amp;gt; einlesen on Wed, 20 Feb 2008 11:25:56 GMT]]></title><description><![CDATA[<p>hrmpf, joar, hatte bloß Probleme bei unsigned char Übergabe an stream.get();<br />
Das mit dem dynamisch allokierten Array habe ich ja bereits erwähnt, ist lediglich fürs Debugging, da sonst der Aufruf relativ lange dauert, da der vector im Debug ziemlich viel Overhead erzeugt.<br />
Die Sache mit dem istreambuf_iterator hat mir vorhin nicht gefallen (als ich sie zuvor schon im Debug-Mode ausprobiert habe, da das Einlesen einer einzelnen Datei hierbei ca 8 sec dauert), allerdings habe ich jetzt einmal Release kompiliert und es ist ziemlich eindeutig die schnellste Möglichkeit, das Ganze einzulesen (jedenfalls gemessen an meinen Tests).<br />
Thx so far</p>
<p>EDIT:<br />
Da mir das ganze ein wenig zu lang gedauert hat (und es sich um eine zeitkritische Anwendung handelt), habe ich es nun wie folgt gelöst:</p>
<pre><code class="language-cpp">//Größe der Datei ermitteln, wie im Original-Post
std::vector&lt;unsigned char&gt; vec( size );
stream.read( (char *) &amp;vec[0], size );
</code></pre>
<p>Ist das in Ordnung, also darf man das verwenden ohne, dass es irgendwo knallt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459336</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Wed, 20 Feb 2008 11:25:56 GMT</pubDate></item><item><title><![CDATA[Reply to Binärfile in vector&amp;lt;unsigned char&amp;gt; einlesen on Wed, 20 Feb 2008 13:25:01 GMT]]></title><description><![CDATA[<p>Weiß nicht, warum du es nicht per Iterator machen willst, aber okay <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>
<pre><code class="language-cpp">std::ifstream stream(file_name.c_str(), std::ios_base::binary | std::ios_base::ate);
if (!stream) return false;

const std::size_t size(stream.tellg());
stream.seekg(0, std::ios_base::beg);

std::vector&lt;unsigned char&gt; data(size);
stream.read(reinterpret_cast&lt;char*&gt;(&amp;data[0]), size);
</code></pre>
<p>sollte dann wohl so sein, wie du es haben willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459436</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 20 Feb 2008 13:25:01 GMT</pubDate></item><item><title><![CDATA[Reply to Binärfile in vector&amp;lt;unsigned char&amp;gt; einlesen on Wed, 20 Feb 2008 13:27:53 GMT]]></title><description><![CDATA[<p>Vorden schrieb:</p>
<blockquote>
<p>Ist das in Ordnung, also darf man das verwenden ohne, dass es irgendwo knallt?</p>
</blockquote>
<p>Oder kurz: Ja, darf man <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1459438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459438</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 20 Feb 2008 13:27:53 GMT</pubDate></item></channel></rss>