<?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[boost::iostreams -&amp;gt; fread?]]></title><description><![CDATA[<p>Hi.<br />
Ich versuche grade ein Dateiformat zu erstellen um Shader in einer einzigen Datei unterzubringen. Dazu habe ich mir boost::iostreams angeschaut, da der auch zippen kann und das eine gute Möglichkeit ist den Code ein wenig zu verstecken ohne viel Aufwand.<br />
Nur stehe ich grade a bissl aufm Schlauch:</p>
<pre><code class="language-cpp">namespace bi = boost::iostreams;

bool NLShaderLoader::saveShader( const std::string&amp; filename, const std::string&amp; vertex, const std::string&amp; fragment )
{
    // Create standard ofstream
    std::ofstream file(filename.c_str(), std::ios_base::out|std::ios_base::binary);

    assert(file.good());
    if ( file.is_open() )
    {
        // Create filter
        bi::filtering_ostream out;
        out.push(bi::zlib_compressor());
        out.push(file);

        // Write Length
        out &lt;&lt; vertex.length() &lt;&lt; &quot;\n&quot;;
        out &lt;&lt; fragment.length() &lt;&lt; &quot;\n&quot;;

        // Write source
        out &lt;&lt; vertex &lt;&lt; &quot;\n&quot;;
        out &lt;&lt; fragment &lt;&lt; &quot;\n&quot;;
    }
    return true;
}
</code></pre>
<p>Die Funktion ist sehr einfach. Sie speichert die Länge des SourceCodes und schreibt diese in die Datei, damit man später das einfacher auslesen kann. Und genau da liegt mein Verständnisproblem grade^^.</p>
<pre><code class="language-cpp">namespace bi = boost::iostreams;

NLShader* NLShaderLoader::loadShader( const std::string&amp; name, const std::string&amp; filename )
{   
    std::ifstream file(filename.c_str(), std::ios_base::in|std::ios_base::binary);
    assert(file.good());

    if ( file.is_open() )
    {
         std::string vertex, fragment;
        int vert_len = 0;
        int frag_len = 0;

        // Create filter
        bi::filtering_istream in;
        in.push(bi::zlib_decompressor());
        in.push(file);

        in &gt;&gt; vert_len;
        in&gt;&gt; frag_len;

        NLShader* s = this-&gt;createFromMemory(name.c_str(), vertex.c_str(), fragment.c_str());
        return s;
    }
    return NULL;
}
</code></pre>
<p>boost::filtering_istream hat jetzt kein fread. Jetzt stehe ich a bissl aufm Schlauch. Ich kann ja nicht einfach aus dem std::ifstream lesen, denn dann lese ich ja das gezippte zeug.<br />
Hmm, hoffe es kann wer ein wenig helfen.<br />
Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284365/boost-iostreams-gt-fread</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 22:07:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284365.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 31 Mar 2011 01:28:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::iostreams -&amp;gt; fread? on Thu, 31 Mar 2011 01:28:29 GMT]]></title><description><![CDATA[<p>Hi.<br />
Ich versuche grade ein Dateiformat zu erstellen um Shader in einer einzigen Datei unterzubringen. Dazu habe ich mir boost::iostreams angeschaut, da der auch zippen kann und das eine gute Möglichkeit ist den Code ein wenig zu verstecken ohne viel Aufwand.<br />
Nur stehe ich grade a bissl aufm Schlauch:</p>
<pre><code class="language-cpp">namespace bi = boost::iostreams;

bool NLShaderLoader::saveShader( const std::string&amp; filename, const std::string&amp; vertex, const std::string&amp; fragment )
{
    // Create standard ofstream
    std::ofstream file(filename.c_str(), std::ios_base::out|std::ios_base::binary);

    assert(file.good());
    if ( file.is_open() )
    {
        // Create filter
        bi::filtering_ostream out;
        out.push(bi::zlib_compressor());
        out.push(file);

        // Write Length
        out &lt;&lt; vertex.length() &lt;&lt; &quot;\n&quot;;
        out &lt;&lt; fragment.length() &lt;&lt; &quot;\n&quot;;

        // Write source
        out &lt;&lt; vertex &lt;&lt; &quot;\n&quot;;
        out &lt;&lt; fragment &lt;&lt; &quot;\n&quot;;
    }
    return true;
}
</code></pre>
<p>Die Funktion ist sehr einfach. Sie speichert die Länge des SourceCodes und schreibt diese in die Datei, damit man später das einfacher auslesen kann. Und genau da liegt mein Verständnisproblem grade^^.</p>
<pre><code class="language-cpp">namespace bi = boost::iostreams;

NLShader* NLShaderLoader::loadShader( const std::string&amp; name, const std::string&amp; filename )
{   
    std::ifstream file(filename.c_str(), std::ios_base::in|std::ios_base::binary);
    assert(file.good());

    if ( file.is_open() )
    {
         std::string vertex, fragment;
        int vert_len = 0;
        int frag_len = 0;

        // Create filter
        bi::filtering_istream in;
        in.push(bi::zlib_decompressor());
        in.push(file);

        in &gt;&gt; vert_len;
        in&gt;&gt; frag_len;

        NLShader* s = this-&gt;createFromMemory(name.c_str(), vertex.c_str(), fragment.c_str());
        return s;
    }
    return NULL;
}
</code></pre>
<p>boost::filtering_istream hat jetzt kein fread. Jetzt stehe ich a bissl aufm Schlauch. Ich kann ja nicht einfach aus dem std::ifstream lesen, denn dann lese ich ja das gezippte zeug.<br />
Hmm, hoffe es kann wer ein wenig helfen.<br />
Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042586</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 31 Mar 2011 01:28:29 GMT</pubDate></item><item><title><![CDATA[Reply to boost::iostreams -&amp;gt; fread? on Thu, 31 Mar 2011 02:24:00 GMT]]></title><description><![CDATA[<p>Hab jetzt eine relativ einfache Lösung gefunden:</p>
<pre><code class="language-cpp">bool NLShaderLoader::saveShader( const char* filename, const std::string&amp; vertex, const std::string&amp; fragment )
{
    // Create standard ofstream
    std::ofstream file(filename, std::ios_base::out|std::ios_base::binary);

    assert(file.good());
    if ( file.is_open() )
    {
        // Create filter
        bi::filtering_ostream out;
        out.push(bi::zlib_compressor());
        out.push(file);

        // Write source
        out &lt;&lt; vertex &lt;&lt; &quot;\n&quot;;
        out &lt;&lt; &quot;//--&lsqb;&lsqb;&rsqb;&rsqb;--\n&quot;;
        out &lt;&lt; fragment &lt;&lt; &quot;\n&quot;;
    }
    return true;
}

bool NLShaderLoader::loadShader( const std::string&amp; name, const char* filename, std::string&amp; o_vertex, std::string&amp; o_fragment )
{
    std::ifstream file(filename, std::ios_base::in|std::ios_base::binary);
    assert(file.good());

    if ( file.is_open() )
    {
        std::stringstream vertex, fragment;

        // Create filter
        bi::filtering_istream in;
        in.push(bi::zlib_decompressor());
        in.push(file);

        std::stringstream ss;
        bi::copy( in, ss );

        // Read Vertex Shader
        {
            std::string line;
            do
            {
                std::getline(ss, line);
                if ( line != &quot;//--&lsqb;&lsqb;&rsqb;&rsqb;--&quot;)
                {
                    vertex &lt;&lt; line &lt;&lt; &quot;\n&quot;;
                }
            }while( line != &quot;//--&lsqb;&lsqb;&rsqb;&rsqb;--&quot;);
        }

        // Read Fragment Shader
        {
            std::string line;
            do
            {
                std::getline(ss, line);
                fragment &lt;&lt; line &lt;&lt; &quot;\n&quot;;
            }while( !ss.eof() );
        }

        o_vertex = vertex.str();
        o_fragment = fragment.str();
        return true;
    }
    return false;
}
</code></pre>
<p>Die Herausforderung ist, zwischen den beiden Teilen zu unterscheiden. Das einfachste schien es mir, einen &quot;Tag&quot;, in dem Fall &quot;//--&lsqb;&lsqb;&rsqb;&rsqb;--&quot; zu reservieren, der im normalen Code nicht vorkommen sollte.<br />
Falls jemand noch bessere Lösungen hat, immer her damit :).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042587</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 31 Mar 2011 02:24:00 GMT</pubDate></item></channel></rss>