binär von stdin lesen und in variable speichern, danach in datei



  • hi,

    irgendwie komm ich nich klar

    ich versuche mit fread und fwrite binär daten von stdin zu lesen und dann in eine mittels fopen geöffnete datei zu speichern.

    sprich erstmal ganz simpel.

    Was muss man denn da alles beachten?

    hier mal n bsp code:

    int main (int argc, char *argv[]) {
            FILE *fp;
            char zeile[1000];
    
            fp = fopen ("/test.log", "wb");
    
            while (!feof(stdin)) {
                    fread(zeile, sizeof(char), 1000, stdin);
                    fwrite(zeile, sizeof(char), strlen(zeile), fp);
            }
    
            fclose(fp);
    

    führe das proggy dann so aus
    cat binaryprog | ./testprog

    und in der datei test.log erscheinen dann nur die erst (ungefär) 20 zeichen aus dem original, der rest wird nich kopiert.

    grüße Jan



  • Du solltest dich dort nicht auf das strlen() verlassen, in binären Daten ist '\0' ein ganz normales Zeichen. Stattdessen solltest du jeweils den Rückgabewert von man: fread als Größenangabe an fwrite weitergeben:

    size_t dsize;
    while (!feof(stdin)) {
      dsize=fread(zeile, sizeof(char), 1000, stdin);
      fwrite(zeile, sizeof(char), dsize, fp);
    }
    

    PS: Und sizeof(char) ist per Definition 1 😉



  • ist das Programm nur zur Übung? Ansonsten seh ich ziemlich wenig Sinn darin.

    cat binaryprog > binary

    oder noch viel besser 🙂

    cp binaryprog binary

    @CStoll
    fread liefert aber size_t zurück, was man nicht unbedingt ohne Wertverlust in ein int konvertieren kann!



  • kingruedi schrieb:

    @CStoll
    fread liefert aber size_t zurück, was man nicht unbedingt ohne Wertverlust in ein int konvertieren kann!

    Stimmt, hast recht *korrigieren geht*



  • juhuu, freu, es geht 🙂

    danke @CStoll

    @kingruedi
    das obige war nur ne übung. hab das jetzt auch schon in das eigentliche programm übernommen. Ich will bestimmte Daten lesen und unter umständen kontrollieren/verändern und dann über eine pipe einem anderen programm zufügen.

    Sozusagen nen Wrapper.

    und joa size_t hab ich nun auch überall verwendet.

    eine frage noch
    hab auch noch ne fgets routine dadrin die ascii zeichen ließt.
    nach dem einlesen mach ich nen strlen() und fordere über malloc speicher an, um den string dadrin zu speichern.
    als ich "int" verwendet hab, musste ich immer +1 machen, wegen dem \0.
    jetzt verwende ich size_t und das "+1" ist zu viel...
    Wie kommt das?

    laut man page von fgets ließt er das \0 mit
    laut man page von strlen wird das zeichen \0 nicht mitgezählt.

    es funzt aber _
    zeilenumbrüche korrekt, kein segmentation fault und keine zeichen zuviel in der neuen datei..

    Grüße Jan



  • Was meinst du mit "+1 ist zu viel"? Eigentlich sollte sich durch die Verwendung von size_t nichts daran ändern und das +1 ist immer noch nötig.



  • Zu viel bedeutet das er mir dann bei einm printf ungültige zeichen aus dem Speicher ausgibt die mit durch malloc reserveiert aber nich gelöscht und nicht durch den string (per bcopy) überschrieben wurden.



  • Hi,

    hab das problem gefunden. Hattest recht, das "+1" muss da sein für das zeichen '\0'. Wenn ich mein komplettes char array per fwrite weitergebe an das andere programm, brauch er das \0 zeichen nicht, weil ich ihm ja eine nbytes angabe mache. Nun muss ich dort aber ein "-1" machen, weil er sonst das \0 auch übergibt und das scheint nicht zu funktionieren.

    gruß jan



  • Wenn du mehr Zeichen siehst, als du sehen willst, ist das ein guter Hinweis darauf, dass der String eben nicht durch \0 terminiert wurde 🙂


Anmelden zum Antworten