fread ließt nicht ordenlich ein
-
Ok jetzt weiss ich was fasch gelaufen ist
es muss heissenwhile( ( sizeRead=fread( buf,1, sizeof(buf), resource)) > 0 ) {Der rückgabewert war null da du null mal 1024 bytes gelesen hast ( waren ja nur 189 )
Kurt
-
so habe das jetzt mal nochmal mit eof probiert
while(!feof(resource)) { fread(buf, sizeof(buf), 1, resource); send(s_, buf, strlen(buf), 0); } } fclose(resource); }habe "buf" mal auf 24 gesetzt
jetzt steht nach jedem inhalt von buf noch 0ù¼
habe dann spaßenshalber strlen(buf) durch strlen(buf)-3 ersetzt
dann war das weg dafür bleibt aber am ende der datei noch 3sonderzeichen die dort nicht hingehören
-
Wie gesagt Du kannst es ruhig so machen nur send wird so wie du's machst nicht richtig funktionieren. ( der buffer ist nicht 0-terminiert -> was strlen(buffer) zurückgibt ist undefiniert und bei binären dateien funktionierts sowieso nicht ). Jetzt reichts mir aber.
Kurt
-
hab gedacht ihr redet von der console das ich dafür mit null terminieren muss
while(!feof(resource))
{
fread(buf, sizeof(buf)-1, 1, resource);
buf [24] = '\0';
send(s_, buf, strlen(buf), 0);
}
}bringt mir lustigerweise den fehler das jetzt der letzte "buf" der ja nicht komplett ist nochmal angehängt wird
-
Mein allerletzter Versuch.
Du kannst strlen() nicht benutzen da du so wie du fread verwendest nicht weist wieviele bytes von fread gelesen wurden.
Wenn du es so machstwhile( ( sizeRead=fread( buf,1, sizeof(buf), resource)) > 0 ) {dann brauchst du kein strlen() und fread gibt dir die anzahl der gelesenen bytes zurück.
Kurt
-
problem dabei ist aber das er dann nur byteweise einlesen tut da hätte ich bei fgetc bleiben können wollte ja extra von diesen byteweise einlesen weg da das blockweise schneller ist und weniger prozessorlastig wäre.
und die idee per fseek die dateigröße bestimmen (bzw ich hab ne funktion schon gebastelt die es von windows ausliest brauchte also den char einfach nur dieser funktion übergeben) und dann alles in einen der größe angepassten buffer packen fällt ja auch weg da der server dann keine dateien im gigabyte bereich senden könnte (jedenfalls nicht sinnvoll)
-
Zuk, den Rückgabewert von fread kann man glaub ich doch nicht für send verwenden, weil es nicht die gelesenen Bytes zurückgibt. Hab mich wohl vertan.
-
ach das funktioniert doch. man muss nur die parameter bei fread vertauschen:
richtig:
fread(buf, 1, sizeof(buf), file);
falsch:
fread(buf, sizeof(buf), 1, pFile);
-
doch so wie er es hat geht es da fread die anzahl der "lesevorgänge" angiebt
und wenn ich sizeof(buf) * 1 Byte lese (und sizeof(buf)=1024ist) dann gibt fread mir die anzahl der gelesen bytes zurück wenn man aber so mit fread umgeht dann kann man sich mit mir auf eine stufe stellen und sollte das programmieren lieber lassen denn im den fall ist fread schwieriger vom code und sogar langsamer als fgetc.
-
ich denke da wird nicht byteweise eingelesen.
-
also ich meine der wird intern wohl size * count direkt einlesen.
-
benutz einfach die datei ein/ausgabe möglichkeiten von c++. da gibts nicht so ein behinderten count parameter.
-
so sieht fread bei visual c++ aus. skippy könnte recht haben mit dem byteweise...
-
oder doch nicht:
da wird ja folgendes gemacht:
if ( (count = total = size * num) == 0 )
na ja ich halt mich besser raus.
-
@denker
if ( (count = total = size * num) == 0 )Es wird nicht byteweise gelesen. Files sind gepuffert und es wird size * num auf einmal in den Ausgabebuffer kopiert ( wenn genug im inputbuffer ist ).
Kurt
-
jo alles klar danke. hatte das stückchen ja auch schon entdeckt aber der quelltext ist ziemlich kompliziert geschrieben. da kann man sich nie so sicher sein.

ich hab auch mit nem api spy programm nachgeguckt. dort wird ReadFile mit 4096 aufgerufen. also skippy das kannste beruhigt benutzen, wobei ich nicht ganz verstehen kann warum du c und c++ so mischt. dein quelltext sieht nach c mit klassen aus.

-
so ich habe das jetzt so gemacht (funktioniert auch)
while(!feof(resource)) { sizeRead=fread( buf,1, sizeof(buf)-1, resource); buf [24] = '\0'; if(feof(resource))continue; send(s_, buf, sizeRead, 0); } } fclose(resource); }hab dazu ne frage zu folgender zeile buf [24] = '\0';
müsste ich das jetzt nich ersetzen durch buf [sizeRead+1] = '\0';
-
Das mit dem feof haste ja scheisse gemacht.
-
@hinweis wieso? hat das nen speziellen grund oder nur aus geschwindigkeitsgründen
@denker ich nutze dewegen beides (c und c++) da sich manche sachen eben besser oder schneller in c schreiben lassen oder die c funktion eben von den parametern einfach besser in dem funktionsablauf des programmes passt
wenn ich assembler können würde würdich sogar versuchen bestimmte sachen eben mit eingebauten assembler machen
übrigens das dateien gebuffert ausgelesen werden ist mir schon klar da windows daten immer nur sektorweise ausließt (daher selbst wenn man ein zeichen auslesen will ließt windows den kompletten sektor aus )
ich meinte eher die verarbeitung daher den overhat der schleifen
aber geeirt hab ich mich trotzdem fread arbeitet immer byteweise schön zusehen war
an eurem zitierten beispiel
if ( (count = total = size * num) == 0 )und weiter unten folgte nämlich die mainloop(so in der art)
while(count >= 0)
{
lese und verabreite dateicount--
}also ist es egal da die funktion ja auch nur bytweise arbeitet
-
Dieses --count passiert nur in einem speziellen Fall!
Die Funktion arbeitet nicht byteweise.