<?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[Datei lesen und versenden]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche den Inhalt einer Datei in einen Buffer zu schreiben:</p>
<pre><code class="language-cpp">int length;
            char * buffer2;

            ifstream is;
            is.open (fileToSend.c_str(), ios::binary );

            // get length of file:
            length = getFileSize(fileToSend);

            // allocate memory:
            buffer2 = new char [length];

            // read data as a block:
            is.read (buffer2 ,length);
            is.close();

            cout &lt;&lt; &quot;will send this buffer : &quot; &lt;&lt; endl;
            cout &lt;&lt; buffer2;
            cout &lt;&lt;endl;
</code></pre>
<pre><code class="language-cpp">//returns filesize
int getFileSize(std::string fileName)
{
    int result = 0;

    ifstream is;
    is.open (fileName.c_str(), ios::binary );

    // get length of file:
    is.seekg (0, ios::end);
    result = is.tellg();

    is.close();

    return result;
}
</code></pre>
<p>In der Datei, die gelesen wird steht:</p>
<pre><code>123

ffff
gggg
XXX
</code></pre>
<p>Der eingelesene Buffer beinhaltet jedoch:</p>
<pre><code>will send this buffer :
123

ffff
gggg
XXX²²²²½½½½½½½½¯■¯■¯■
</code></pre>
<p>Woher kommen diese Sonderzeichen nach den letzten XXX? Ich vermute, dass die Länge der Datei falsch ermittelt wird, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/232647/datei-lesen-und-versenden</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 05:00:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/232647.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 25 Jan 2009 12:07:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datei lesen und versenden on Wed, 28 Jan 2009 08:36:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche den Inhalt einer Datei in einen Buffer zu schreiben:</p>
<pre><code class="language-cpp">int length;
            char * buffer2;

            ifstream is;
            is.open (fileToSend.c_str(), ios::binary );

            // get length of file:
            length = getFileSize(fileToSend);

            // allocate memory:
            buffer2 = new char [length];

            // read data as a block:
            is.read (buffer2 ,length);
            is.close();

            cout &lt;&lt; &quot;will send this buffer : &quot; &lt;&lt; endl;
            cout &lt;&lt; buffer2;
            cout &lt;&lt;endl;
</code></pre>
<pre><code class="language-cpp">//returns filesize
int getFileSize(std::string fileName)
{
    int result = 0;

    ifstream is;
    is.open (fileName.c_str(), ios::binary );

    // get length of file:
    is.seekg (0, ios::end);
    result = is.tellg();

    is.close();

    return result;
}
</code></pre>
<p>In der Datei, die gelesen wird steht:</p>
<pre><code>123

ffff
gggg
XXX
</code></pre>
<p>Der eingelesene Buffer beinhaltet jedoch:</p>
<pre><code>will send this buffer :
123

ffff
gggg
XXX²²²²½½½½½½½½¯■¯■¯■
</code></pre>
<p>Woher kommen diese Sonderzeichen nach den letzten XXX? Ich vermute, dass die Länge der Datei falsch ermittelt wird, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651929</guid><dc:creator><![CDATA[filth]]></dc:creator><pubDate>Wed, 28 Jan 2009 08:36:15 GMT</pubDate></item><item><title><![CDATA[Reply to Datei lesen und versenden on Sun, 25 Jan 2009 12:51:34 GMT]]></title><description><![CDATA[<p>1. Warum öffnest Du die Datei zweimal? Es ist unsinnig die Ermittling der Dateigröße durch ein zweites öffnen zu ermitteln.<br />
2. Du kannst doch nicht davon ausgehen, dass Dein Stresm den Du liest mit einem 0 Zeichen terminiert wird. Du bekommst Die Anzahl von Zeichen die Du lesen wolltest. Danach steht nunmal Garbage in Deinem Puffer.<br />
Workarround könnte sein: length+1 allokieren und auf length in den Array 0 eintragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651964</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sun, 25 Jan 2009 12:51:34 GMT</pubDate></item><item><title><![CDATA[Reply to Datei lesen und versenden on Tue, 27 Jan 2009 22:37:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke - so klappt es.<br />
Es gibt aber ein weiteres Problem:</p>
<p>Es funktioniert bei allen Dateien, die anscheinend keine Sonderzeichen beinhalten.</p>
<p>Sobald ich versuche zb eine .jpg einzulesen, werden nur ein paar Zeichen gelesen:</p>
<pre><code>will send this buffer :
Ï Ó
</code></pre>
<p>Hier nochmal zur Sicherheit der Lese-Block:</p>
<pre><code class="language-cpp">ifstream is;
            is.open (fileToSend.c_str(), ios::binary );

            // get length of file:
            length = getFileSize(fileToSend);

            // allocate memory:
            buffer2 = new char [length+1];

            // read data as a block:
            is.read (buffer2 ,length);
            is.close();

            buffer2[length] = '\0';

            cout &lt;&lt; &quot;will send this buffer : &quot; &lt;&lt; endl;
            cout &lt;&lt; buffer2;
            cout &lt;&lt;endl;
</code></pre>
<p>Was istn da los <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Grüße<br />
Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653564</guid><dc:creator><![CDATA[filth]]></dc:creator><pubDate>Tue, 27 Jan 2009 22:37:26 GMT</pubDate></item><item><title><![CDATA[Reply to Datei lesen und versenden on Tue, 27 Jan 2009 22:43:39 GMT]]></title><description><![CDATA[<p>Warscheinlich nix, nur das die Ausgabe beim ersten 0 abgebrochen wird, Strings werden immer mit 0 terminiert, also auch die Ausgabe. Wobei ich bei der Sache net versteh was das mit MFC zu tun hat (anders gesagt falsches Subforum). Aber das nur nebenbei, aber du kannst keine Binärdatei wie ein Bild einfach so als text Ausgeben.</p>
<p>Gruß Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653566</guid><dc:creator><![CDATA[CTecS]]></dc:creator><pubDate>Tue, 27 Jan 2009 22:43:39 GMT</pubDate></item><item><title><![CDATA[Reply to Datei lesen und versenden on Tue, 27 Jan 2009 22:49:27 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>das Problem besteht aber auch auf der Empfängerseite - den buffer verschicke ich so über ein Socket und schreibe den Inhalt wieder in eine Datei. Dort landen aber auch nur die paar Zeichen, die in der Ausgabe zu sehen sind.</p>
<p>Sorry wegen dem Forum, wo gehört´s denn hin und kann ein Mod vielleicht verschieben?</p>
<p>Gruß<br />
Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653568</guid><dc:creator><![CDATA[filth]]></dc:creator><pubDate>Tue, 27 Jan 2009 22:49:27 GMT</pubDate></item><item><title><![CDATA[Reply to Datei lesen und versenden on Wed, 28 Jan 2009 07:58:05 GMT]]></title><description><![CDATA[<p>Dir muss klar sein, dass viele Operationen wie zum Beispiel &quot;cout &lt;&lt;&quot; für einen char* eben auf ein 0 Zeichen reagiert...</p>
<p>Wenn Du binär in die Datei schreiben willst solltest Du auch entsprechend eine Funktion wie write verwenden, bei der Du die Länger der zu schreibenden Daten angibst!</p>
<p>BTW Nochmal:<br />
Dein Funktion getFileSize ist Schotter. Warum öffnest Du eine Datei nochmal um die Größe zu ermitteln, wenn Du sie schon offen hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653646</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 28 Jan 2009 07:58:05 GMT</pubDate></item><item><title><![CDATA[Reply to Datei lesen und versenden on Wed, 28 Jan 2009 07:58:36 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-100590.html" rel="nofollow">Martin Richter</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-1.html" rel="nofollow">MFC (Visual C++)</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653648</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Wed, 28 Jan 2009 07:58:36 GMT</pubDate></item><item><title><![CDATA[Reply to Datei lesen und versenden on Wed, 28 Jan 2009 08:35:59 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>jap, das mit getFileSize ist mir klar, ist korrigiert.<br />
Das Schreiben funktioniert nun per:</p>
<pre><code class="language-cpp">f.write(buffer, nret);
</code></pre>
<p>Nun gibt es aber ein anderes Problem - evtl sollte ich dafür einen neuen Thread aufmachen, ich versuche es aber erstmal hier, um nicht alles voll zu posten.</p>
<p>Das Versenden kleinerer Dateien funktioniert (160 byte).<br />
Versuche ich eine größere (80 kByte) Datei zu versenden, beinhaltet die Empfangsseite ab einem bestimmten Punkt im Buffer nur noch Schrott.</p>
<p>Ich habe probehalber den Buffer vor dem Versenden in eine Datei geschrieben - da passt es noch. Ergo geht beim Senden was schief.</p>
<p>Hängt es mit meiner Vorgehensweise ab? Der Algorithmus ist im moment so:</p>
<p>1. Datei lesen und Größe feststellen<br />
2. Sender versendet Header mit Dateinamen und Größe.<br />
3. Empfänger richtet Buffer entsprechend der Dateigröße ein und sendet ein ACK<br />
4. Sender empfängt ACK und sendet den gesamten Buffer auf einmal.</p>
<p>Jetzt kann man nicht beliebig große Datenpackete versenden, der Buffer wird von irgendeiner Schicht segmentiert und da vermute ich den Fehler. Sieht das jemand ähnlich?<br />
In diesem Fall müsste ich den Buffer in N Pakete zerlegen und häppchenweise senden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653668</guid><dc:creator><![CDATA[filth]]></dc:creator><pubDate>Wed, 28 Jan 2009 08:35:59 GMT</pubDate></item><item><title><![CDATA[Reply to Datei lesen und versenden on Wed, 28 Jan 2009 08:44:46 GMT]]></title><description><![CDATA[<p>filth schrieb:</p>
<blockquote>
<p>ich versuche den Inhalt einer Datei in einen Buffer zu schreiben:</p>
</blockquote>
<p>einfach so:</p>
<pre><code class="language-cpp">std::ifstream is( fileToSend.c_str(), std::ios_base::binary );
    std::string buffer( (std::istreambuf_iterator&lt; char &gt;( is )), std::istreambuf_iterator&lt; char &gt;() ); // erfordert #include &lt;iterator&gt;
</code></pre>
<p>klappt auch mit Sonderzeichen<br />
Bem.: ich hoffe Du hast nicht MS VC6 - das kann das nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653682</guid><dc:creator><![CDATA[Werner_logoff]]></dc:creator><pubDate>Wed, 28 Jan 2009 08:44:46 GMT</pubDate></item><item><title><![CDATA[Reply to Datei lesen und versenden on Wed, 28 Jan 2009 08:46:36 GMT]]></title><description><![CDATA[<p>Hallo Werner,</p>
<p>danke für den Codeschnippsel, aber das Lesen funktioniert schon - siehe mein letztes Posting <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="😉"
    /><br />
Hilfe bzgl des neuen Problems wäre aber erwünscht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1653683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1653683</guid><dc:creator><![CDATA[filth]]></dc:creator><pubDate>Wed, 28 Jan 2009 08:46:36 GMT</pubDate></item><item><title><![CDATA[Reply to Datei lesen und versenden on Wed, 28 Jan 2009 22:39:25 GMT]]></title><description><![CDATA[<p>filth schrieb:</p>
<blockquote>
<p>Hilfe bzgl des neuen Problems wäre aber erwünscht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Der C++-Weg so etwas zu lösen, besteht darin, sich einen passenden std::streambuf zu schreiben. Diesem kann man dann die Aufgabe überlassen, die Pakete zurechtzuschneiden und zu verschicken. Das sähe in etwa so aus:</p>
<pre><code class="language-cpp">#include &lt;streambuf&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;cassert&gt;

class Packager : public std::streambuf
{
public:
    explicit Packager( std::size_t n )
        : m_buffer( n )
    {
        // Schreibpuffer auf den 'm_buffer' setzen
        setp( &amp;m_buffer[0], &amp;m_buffer[0] + m_buffer.size() );
    }

protected:
    virtual int_type overflow( int_type m = traits_type::eof() )
    {
        assert( !m_buffer.empty() );
        assert( pbase() != 0 &amp;&amp; pptr() &gt; pbase() );
        if( !write( pbase(), std::size_t( pptr() - pbase() ) ) )
            return  traits_type::eof(); // Fehler beim Schreiben
        setp( &amp;m_buffer[0], &amp;m_buffer[0] + 1, &amp;m_buffer[0] + m_buffer.size() );
        m_buffer[0] = traits_type::to_char_type( m );
        return traits_type::not_eof( m );
    }
    virtual int sync()
    {
        assert( !m_buffer.empty() );
        assert( pbase() != 0 &amp;&amp; pptr() &gt;= pbase() );
        if( pptr() &gt; pbase() )
        {
            if( !write( pbase(), std::size_t( pptr() - pbase() ) ) )
                return -1; // Fehler
            setp( &amp;m_buffer[0], &amp;m_buffer[0] + m_buffer.size() );
        }
        return 0; // ok
    }
private:
    bool write( const char* buf, std::size_t buf_len )
    {
        // hier kannst Du jetzt Deine Daten absenden
        // buf_len ist immer &lt;= N (s. Konstruktor)
        return true; // ok
    }
    std::vector&lt; char &gt; m_buffer;
};
</code></pre>
<p>in der Methode write musst Du dann den Code einfügen, der die Daten versendet.</p>
<p>Vorteil des streambuf's liegt in der Kombination mit dem ostream, d.h. man kann unmittelbar Objekte reinschreiben. Die Anwendung sähe in Deinem Fall so ähnlich aus wie:</p>
<pre><code class="language-cpp">int main()
{
    using namespace std;
    Packager packager( 60 ); // Paketgröße wählen
    ostream out( &amp;packager );
    string fileToSend = &quot;input.txt&quot;;
    out &lt;&lt; &quot;Header&quot;;    // Datei-Header
    ifstream is( fileToSend.c_str(), ios_base::binary );
    out &lt;&lt; is.rdbuf();  // schreibt die (beliebig große) Datei komplett raus
    if( out.flush() )   // flush ruft sync
        cout &lt;&lt; &quot;alles gesendet&quot; &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
<p>@Edit: Bugfix Zeile 12 - Konstante 200 in buffer(..) durch n ersetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654000</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 28 Jan 2009 22:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to Datei lesen und versenden on Wed, 28 Jan 2009 22:24:08 GMT]]></title><description><![CDATA[<p>Ui gleich kompletter Code.</p>
<p>Danker Werner, ich werde es mir morgen in Ruhe anschauen und ausprobieren!</p>
<p>Grüße<br />
Alex</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654116</guid><dc:creator><![CDATA[filth]]></dc:creator><pubDate>Wed, 28 Jan 2009 22:24:08 GMT</pubDate></item></channel></rss>