fscanf oder fread



  • was ist eurer meinung nach effinzienter:
    fscanf oder fread

    oder in welchen fall wendet man das eine an und das andere nicht?



  • Man verwendet std::[i]fstream::operator >> oder std::[i]fstream::read. Den Operator beim formatierten einlesen, und read beim binären einlesen.



  • hab eine binäre datei



  • fscanf parst die Daten, fread liest sie. Kurz gesagt fscanf ist für Textdateien und fread für binäre Dateien besser geeignet...

    EDIT: Für fstreams gibts auch blockorientierte Lese- und Schreibfunktionen.



  • ich habe folgende zwei sachen getestet:

    erstens:
    long size = 0;
    fread(&size, sizeof(long), 1, file);
    
    zweitens:
    long size = 0;
    fscanf(file, "%ld", size);
    

    wobei ich mit fread den richtigen wert zurück bekomme.
    bei fscanf einfach nur 0



  • Weil fscanf die Daten parst, und fread liest nur.

    Mit fscanf liest Du hier eine als Text gespeicherte Zahl ein wobei fscanf entscheidet wie lang diese Zahl ist (Die Ziffer '1', gefolgt von der Ziffer '3', ... bis zu einer nicht-Ziffer). Mit fread liest Du genau vier Bytes (meistens) binär ein und interpretierst diese Daten als Long.

    Ach: Bei fscanf muss auch die Adresse übergeben werden.



  • @LordJaxom: stimmt, aber

    fscanf(file, "%ld", &size);
    

    tut es leider auch nicht.
    bleich ich wohl beim fread...



  • asr schrieb:

    @LordJaxom: stimmt, aber

    fscanf(file, "%ld", &size);
    

    tut es leider auch nicht.

    Das kommt ganz darauf an, wie deine Daten in der Datei drinstehen - fscanf() erwartet keine Binärdaten, sondern eine textuell dargestellte Zahl (also z.B. "4711" oder "123456").

    bleich ich wohl beim fread...

    Ich hätte einen besseren Vorschlag: nimm fstream::read() 😉



  • asr schrieb:

    @LordJaxom: stimmt, aber

    fscanf(file, "%ld", &size);
    

    tut es leider auch nicht.
    bleich ich wohl beim fread...

    Sagte ich nicht dass fread die Daten binär liest, mit fester Länge, und fscanf eine als Text gespeicherte Zahl interpretiert?

    Soll ich es Dir aufmalen? 😉

    Das ist Deine Datei:

    1240,26,122
    

    Wenn Du mit fscanf liest, wird interpretiert. Er liest ein Zeichen, merkt dass das eine Ziffer ist, liest noch ein Zeichen, usw, bis er merkt dass das Komma keine Ziffer mehr ist. Dann rechnet er den Text "1240" um in die Zahl Eintausendzweihundertvierzig.

    fread liest vier Bytes als long ein. Das sind zufällig auch die 1, die 2, die 4 und die 0. Aber nicht die Zeichen 1, 2, 4 und 0 stehen hinterher in der long-Variable, sondern die Zahl, die durch die ASCII-Codes dieser vier Ziffern, interpretiert als long, gebildet wird. (Die Zahl lautet in dem Fall 808727089).

    Anyway: Weisst Du was in Deiner Datei, die Du liest, steht? Hast Du Dir die mal mit nem Editor angeschaut?



  • o.k. habs kapiert.

    hab eine binärdatei und weiss auch was drin steht. seh dann auch ein, dass es fscanf nicht tut.

    thx


Anmelden zum Antworten