fread ließt nicht ordenlich ein



  • hör auf binäre daten auf der konsole auszugeben. und wenn dann mach wenigstens die 0 terminierung hin.



  • Skippy schrieb:

    wieder das selbe problem er geht nicht nicht in die while schleife

    nur warum?

    Woraus schliesst du das er nicht in die Schleife kommt. Welchen Wert hat sizeRead.
    Kurt



  • schließen tue eich das aus folgendem

    while( ( sizeRead=fread(buf, sizeof(buf), 1, resource)) > 0 ) { 
              printf ( "line to send: %s", buf );
           send(s_, buf, sizeRead, 0);
         }
             printf ( "line to send2: %s", buf );
         fclose(resource); // wenns nicht offen ist muss man auch nicht schliessen
      }
    }
    

    das erste printf wird nicht in der konsole angezeigt auch nciht mit leerer variabel
    das 2 aber schon und zwar mit der kompletten datei(189byte) und daraus kann man sehr gut schließen das er nicht die schleife ausführt sondern einfach weiter macht



  • Kann ich kaum glauben. Lass das 2. printf weg.
    BTW dein Buffer ist nicht 0-terminiert wie .f schon sagte.
    Kurt



  • fread(buf, sizeof(buf), 1, resource)
    

    Das hier liest keine 1024 Zeichen wie gewünscht. sizeof(buf) gibt bestimmt 4 zurück = sizeof char. Benutz das bitte so:

    fread(buf, sizeof(char)*1024, 1, resource);
    

    rya.
    Scorcher24

    edit: Vergiss es, hab da was missverstanden... *grummel* *peinlich*



  • sizeof(buf) gibt bestimmt 4 zurück

    Nicht raten...



  • *grins*lasst meine konsole doch in ruhe so kann ich es zu testzwecken am einfachsten anschaun sobalt die funktion funzt kommen die doch raus

    übrigens fread hatt den rückgabewert 0 fand folgendes dazu bei google

    fread

    Prototyp : size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
    Header : <stdio.h>

    Beschreibung :
    fread liest n Datenelemente, die jeweils die Größe size Bytes haben, aus dem angegebenen Stream in den Speicherbereich, auf den ptr zeigt. Es werden insgesamt (n * size) Bytes gelesen.

    Rückgabewert :
    fread liefert bei fehlerfreier Ausführung die Anzahl der gelesenen Datenelemente (nicht Bytes) zurück. Im Falle eines Fehlers oder am Dateiende wird die Anzahl von Elementen (möglicherweise 0) zurückgeliefert, die noch fehlerfrei gelesen werden konnten.

    also kann ich das mit der while schleife so schon mal vergessen mein problem ist das ich das mit eof hatte auch irgendwie verhaspelt



  • Ok jetzt weiss ich was fasch gelaufen ist
    es muss heissen

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


Anmelden zum Antworten