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 ^^