std::ostream write() schreibt manchmal zu wenige Bytes in Datei



  • Mein Problem ist, dass die Methode write von ofstream manchmal nicht alle Bytes, die ich mit recv() (SOCKETS) empfange, in die erstellte Datei schreibt:

    os.open(s,std::ios::binary | std::ios::app);
    		if((retval=recv(sock,buf2,BUF_SIZ,0))>0)
    		{
    		os.write(buf2,retval);
    		}
    
    		if(os.bad())
    		{
    			MessageBox(0,"Fehler",0,0);
    		}
    

    Woran kann das liegen? Kann ich irgendwie überprüfen, wieviele Bytes in die Datei geschrieben wurden und gegebenenfalls die restlichen Bytes noch hinzuschreiben? Rückgabewert von write() ist ja *this, womit ich nicht viel anfangen kann (bin neu).



  • (retval=recv(sock,buf2,BUF_SIZ,0))>0 vielleicht ?
    versuch mal...

    os.open(s,std::ios::binary | std::ios::app);
    retval = recv(sock,buf2,BUF_SIZ,0);
    if(retval >= 0)
    {
        os.write(buf2,retval);
    }
    
    if(os.bad())
    {
       MessageBox(0,"Fehler",0,0);
    }
    

    vvv Guck meine signatur. Das trifft genau zu. (Also, bin mir nicht sicher...) vvv



  • HELPVISTAWIN7 schrieb:

    Kann ich irgendwie überprüfen, wieviele Bytes in die Datei geschrieben wurden und gegebenenfalls die restlichen Bytes noch hinzuschreiben? Rückgabewert von write() ist ja *this, womit ich nicht viel anfangen kann (bin neu).

    Der C++-Standard garantiert Dir, dass 'retval' Zeichen in die Datei geschrieben wurden, wenn der Status des Streams nicht auf bad geht - siehe Referenz zu write.

    bzw. um es programmiertechnisch auszudrücken:

    if((retval=recv(sock,buf2,BUF_SIZ,0))>0)
            {
                if( !os.write(buf2,retval) )
                {
                    std::cerr << "Fehler beim Schreiben in buf2'" << std::endl;
                }
                // else // hier ist garantiert, dass retval Zeichen geschrieben wurden
            }
    

    ansonsten wäre ein konkreter Fall hilfreich. Wie sieht die Zeichenfolge aus, die Deiner Meinung nach nicht vollständig geschrieben wird, und wie prüfst Du das?

    Gruß
    Werner



  • HELPVISTAWIN7 schrieb:

    Mein Problem ist, dass die Methode write von ofstream manchmal nicht alle Bytes, die ich mit recv() (SOCKETS) empfange, in die erstellte Datei schreibt:

    Wie stellst du fest, dass write nicht alle Bytes geschrieben hat? Wenn du dir den Inhalt der Datei ansiehst, ohne den Stream geflusht oder geschlossen zu haben, könnten Bytes im Puffer stecken bzw. verloren gegangen sein.



  • manni66 schrieb:

    HELPVISTAWIN7 schrieb:

    Mein Problem ist, dass die Methode write von ofstream manchmal nicht alle Bytes, die ich mit recv() (SOCKETS) empfange, in die erstellte Datei schreibt:

    Wie stellst du fest, dass write nicht alle Bytes geschrieben hat? Wenn du dir den Inhalt der Datei ansiehst, ohne den Stream geflusht oder geschlossen zu haben, könnten Bytes im Puffer stecken bzw. verloren gegangen sein.

    Gar nicht. Daher war ja auch meine Frage, wie ich die Anzahl der geschriebenen Bytes herausfindet... Wenn es so ist, dass write() im Falle eines BADBITs nichts schreibt, würde ich den Schreibvorgang einfach so lange wiederholen, bis es geklappt hat.



  • HELPVISTAWIN7 schrieb:

    Wenn es so ist, dass write() im Falle eines BADBITs nichts schreibt, würde ich den Schreibvorgang einfach so lange wiederholen, bis es geklappt hat.

    du kannst imho nicht herausbekommen, wie viel geschrieben wurde.
    also nicht driekt - du kannsts natürlich mit tellg usw. berechnen.
    aber wiederholen bis es klappt ist selten eine gute idee - wenn da was schief geht, wird das seine gründe haben(hdd voll/kaputt - nen anderer fällt mir gerad nicht ein)

    bb


Anmelden zum Antworten