ifstream



  • Also zu erst mal: es sollen auch nicht ASCII-Dateien gelesen werden können...

    void writebuf (unsigned __int32 laenge)
    	{
    		buf = new char[laenge+1]; //deklariert als 'char *buf'
    		memset (buf, 0, laenge+1); //wahrscheinlich unnötig?
    		stream->seekg ((actpart-1) * partsize, ios::beg); //da die Datei in mehrere Parts zerlegt wird, muss er erst mal gucken, wo er anfangen soll zu lesen ^^
    		do
    			{
    				char *buf2 = new char[laenge - strlen (buf)+1];
    				stream->read (buf2, laenge - strlen (buf));
    				sprintf (buf, "%s%s", buf, buf2);
    			} while (strlen (buf) < laenge);
    		buf[laenge+1] = '\0';
    	};
    

    jz habe ich zwar endlich nicht nur die ersten 5 Zeichen der Datei, aber am ende des buffers (buf) stehen trotzdem noch hunderte Zeichen, die einfach nur Müll sind - und die ersten Zeichen sind auch weg : < Und die ersten 5 Zeichen sind auch wieder falsch (nachdem sie am Anfang die ganze Zeit richtig waren ^^) -.-
    Außerdem geb ich das Zeugs (bis jz einfach aus, um zu gucken, wie es aussieht und nicht jedes ma mit Haltepunkten da durch zu müssen - kann ich da z.bsp. dieses Piepen deaktivieren? (bis jz mach ich es mit cout << ... << endl und bei jedem (was auch immer dieses Steuerzeichen ist - weiß ich ne ausm Kopf ) - piept mein PC doof - das nervt auch ein wenig ^^

    Wäre euch sehr dankbar über Hilfe (ich weiß, das Thema gabs schon hunderte male, aber da war es immer nur zeichenweise auslesen/ascii/... - oder ich war zu doof, zu suchen ^^)

    btw: das Senden dann so stimmt aber, oder:

    //char *buf (der oben ausgelesene Buffer)
    send ((SOCKET) s, buf, strlen (buf), MSG_OOB)
    

    Danke Tom : >



  • Du solltest den Buffer nach der Menge der eingelesenen Zeichen mit 0 terminieren, nicht nach der gesamten allozierten Länge.



  • Wieso liest du eigentlich nicht direkt in deinen Buffer? So öffnest du dir nur ein riesiges Speicherleckt (von anderen Problemen gar nicht zu reden).

    Ansonsten: Bei Binärdaten ist das '\0' ein ganz normales Zeichen und kann auch mitten in den Daten vorkommen - da bringt es recht wenig, mit strlen() die gelesene Datenmenge ermitteln zu wollen. Wenn du wissen willst, wieviel gerade angekommen ist, nimm lieber stream->gcount().
    (und wenn read() tatsächlich weniger Daten bekommen hat als du wolltest, ist wohl die Datei zu Ende gewesen)



  • The-Kenny schrieb:

    Du solltest den Buffer nach der Menge der eingelesenen Zeichen mit 0 terminieren, nicht nach der gesamten allozierten Länge.

    Danke - klingt ja ganz gut, aber so weit ich weiß, bietet ifstream keine fkt an, die mir irgendwo wiedergibt, wie viele Zeichen ausgelesen wurden... Und wenn ich die 0 mit buf[strlen(buf)] setze hab ich auch nichts gekonnt, weil strlen ja gerad eben nach der 0 guckt, die ich erst noch setzen will - oder?

    //edit:
    @CStoll: Nein, die Datei ist noch nicht zu Ende... Sie ist ca. 10MB groß (hab gerad ne docx genommen) und read gibt mir trotzdem immer nur 5 Zeichen wieder - wenn ich die Datei im notepad/direkt in der Konsole angucke, dann sieht man da auch, dass nach diesen 5 Zeichen ein Stück Platz ist...
    Warum nicht direkt aus dem Stream: Weil ich dann nicht weiß, wie viel er ausgelesen hat? -.-



  • unskilled schrieb:

    The-Kenny schrieb:

    Du solltest den Buffer nach der Menge der eingelesenen Zeichen mit 0 terminieren, nicht nach der gesamten allozierten Länge.

    Danke - klingt ja ganz gut, aber so weit ich weiß, bietet ifstream keine fkt an, die mir irgendwo wiedergibt, wie viele Zeichen ausgelesen wurden...

    Doch, bietet es - gcount()
    (oder du verwendest readsome(), das gibt die Anzahl der gelesenen Zeichen als Rückgabewert raus)



  • Danke : >
    readsome klang auch sehr gut, aber iwie... :

    stream->seekg ((actpart-1) * partsize, ios::beg);
    	streamsize l = stream->readsome (buf, laenge);
    

    l == 0
    buf == ""

    ist iwas falsch daran? Oo



  • Ich hoffe mal, die Datei ist groß genug, daß deine Startposition noch vor dem EOF liegt.



  • ja ^^
    "Sie ist ca. 10MB groß (hab gerad ne docx genommen)"
    und nach den 5 Zeichen geht es ja auch noch weiter ^^ das ging auch zum Teil ganz gut mit dem oben geposteten code - wobei ganz gut nicht heißt, dasses ohne fehler ging ^^ nur eben besser, als ich es ansonsten hinbekommen hatte -.-



  • Dann solltest du eventuell mal überprüfen, ob von früheren Aktionen noch Fehlerflags im Stream gesetzt sind (ist so eine Eigenheit der IO-Streams - solange der Status nicht auf goodbit steht, weigern sie sich, etwas zu machen).



  • hmm...

    stream->seekg ((actpart-1) * partsize, ios::beg);
    stream->clear ();
    streamsize l = stream->readsome (buf, laenge);
    

    bringt keine besserung -.-
    und wenn ich statt readsome read nehm, dann geht es ja auch - also bis zu dem ersten byte, was leer ist oder wie auch immer ^^


Anmelden zum Antworten