fread ließt nicht ordenlich ein



  • 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 machst

    while( ( 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...

    http://rafb.net/paste/results/ms1IHi57.html



  • 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 datei

    count--
    }

    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.


Anmelden zum Antworten