Binär lesen und schreiben



  • Hallo Leute!

    Ich versuche schon seit langem einen Code zu schreiben, bei dem man eine Zahl eingeben kann und folgendes sollte dann passieren:
    - Die Zahl wird Binär in einer Datei eingeschrieben.
    - Die Zahl wird daraufhin geprüft, ob sie eine Primzahl ist
    -> Wenn ja, dann sollte in der binären Datei eine 1 angehängt werden
    -> Wenn nein, dann sollte in der binären Datei eine 0 abgehängt werden
    - Diese Daten sollten als kleiner Bonus noch in der Konsole angezeigt werden

    Neue Zahlen sollten NICHT die Binäre Datei überschreiben, sondern nach einem Zeilenumbruch eingeschrieben werden 😋

    Falls irgend welche C-Veteranen eine Ahnung davon haben, wäre ich sehr glücklich wenn ihr mir helfen könntet 👍

    Hier noch mein komlpletter Code (der noch lange nicht fertig ist!):

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    
    int main()
    {
        /*int zahl = 0;
        printf("Geben Sie eine Zahl ein  ");
        scanf("%d", &zahl);
        if
            (zahl == 0) {
                printf("%d ist keine Primzahl", zahl);
            }
    
            else if  (zahl == 2) {
                printf("%d ist eine Primzahl!", zahl);
            }
    
            else if  (zahl == 1) {
                printf("%d ist keine Primzahl!", zahl);
            }
    
            else if  (zahl%2 == 0) { //Modulo-Funktion (wenn zahl geteilt 2, rest = 0, dann printf...)
                printf("%d ist keine Primzahl", zahl);
            }
    
            else if  (zahl%3 == 0) {
                printf("%d ist keine Primzahl!", zahl);
            }
    
            else if  (zahl%4 == 0) {
                printf("%d ist keine Primzahl!", zahl);
            }
    
            else if  (zahl%5 == 0) {
                printf("%d ist keine Primzahl!", zahl);
            }
    
            else if  (zahl == 3) {
                printf("%d ist eine Primzahl", zahl);
            }
    
            else if  (zahl == 5) {
                printf("%d ist eine Primzahl!", zahl);
            }
    
            else if  (zahl == 7) {
                printf("%d ist eine Primzahl!", zahl);
            }
    
        else{
        printf("%d ist eine Primzahl!", zahl);
        }*/
    
    /*FILE *stream;
    stream = fopen("..\file.bin", "a+");
    if( (stream = fopen("file.bin", "a+")) == NULL) {
    
    printf( "Fehler: Datei existiert nicht");
    }
    else
    {
    printf("Die Datei existiert");
    }
    fclose(stream);
    
    return 0;*/
    
    char string[] = "";
    
    FILE* datei;
    
    if( (datei = fopen("file.bin", "ab+")) == NULL)
    {
    printf( "Fehler: Datei existiert nicht");
    }
    
    else
    {
    printf("Die Datei existiert");
    }
    
    scanf(datei, "%s", &string);
    //int datei = fopen("..\file.bin","a+");
    /* alternativ zu r+
    r - nur zum lesen
    w - nur zum schreiben
    r+, w+ - zum schreiben UND lesen (ueberschreiben der datei)
    a - schreiben, aber anhaengen an die datei
    a+ - schreiben und lesen, an die datei wird angehaengt*/
    
    /*if(datei == NULL)
    //fehler beim oeffnen
    {
        return -1;
    }*/
    
    fseek(datei,0,SEEK_END);
    
    fprintf(datei,"Schreibe etwas in die Datei: ");
    fscanf(datei,"%s",&string);
        //P(10) ~ 10 / log(10);
    printf(datei,"%s",&string);
    fclose(datei);
    //wichtig: FILE* muss wieder geschlossen werden
    return 0;
    }
    

    Beim Komplilieren geht alles, aber das Programm stürzt kurz danach ab 😞

    Danke für die Hilfe!
    Lg Rogon 😃



  • fscanf ist zum lesen aus der Datei da. Damit schreibst du keine Daten in die Datei.

    Da du aber vorher mit fseek() den Dateizeiger an das Dateiende gestellt hast (ist bei "a" überflüssig) gibt es dort keine Daten.

    Warum willst du die Zahlen binär schreiben?
    Was für eine 1 soll das sein? '1' oder 1 ?
    Binärdaten und Zeilenvorschub wiedersprechen sich etwas, da In der Binärcodierung einer Zahl auch der Zeilenvorschub enthalten sein kann.

    Du hast in deinem Programm diese lange if-else-Kette auskommentiert.
    Wenn du die nicht brauchst, poste sie nicht mit. Da macht dein Program ünübersichtlich.

    Binär schreiben geht mit fwrite. Die '1' und das '\n' bekommst du mit fprintf oder fputc in die Datei.

    Mach den Primzahlentest auf alle Fälle als Funktion.



  • Vielleicht solltest du mal deinem Array eine bestimmte Größe geben.

    Oder halt mit malloc so viel Speicher reservieren wie benötigt wird, das wäre denke ich mal das beste.

    char string[200];  // Statische größe von 200 Byte
    

    Schau einfach mal hier: http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/


  • Mod

    Dein ein Zeichen langes Array string ist sicherlich nicht lang genug für das erste Wort in der Datei.

    Und ich bin mir ziemlich sicher, dass du nicht richtig weißt, was das Binärattribut bei Dateien überhaupt bedeutet.

    edit: Ich bin mal wieder viel zu langsam...



  • Noch etwas:
    Du überprüfst zwar, ob du die Datei öffnen konnest und gibst eine Meldung aus, dann machst du aber weiter, egal ob das Öffnen erfolgreich war oder nicht.



  • In den Zeilen 105 und 107:

    fscanf(datei,"%s",&string);
        //P(10) ~ 10 / log(10);
    printf(datei,"%s",&string);
    

    gehören vor string keine &.
    printf erwartet als ersten Paramter einen Formatstring und keinen Zeiger auf FILE.



  • DirkB schrieb:

    Was für eine 1 soll das sein? '1' oder 1 ?
    Binärdaten und Zeilenvorschub wiedersprechen sich etwas, da In der Binärcodierung einer Zahl auch der Zeilenvorschub enthalten sein kann.

    Also als Beispiel wenn der Benutzer 125 eingibt, sollte in der Binären Datei "1111101 0" stehen. (Mit Zeilenumbruch)
    In der Konsole sollte dann "125 Keine Primzahl" (Auch mit Zeilenumbruch)

    DirkB schrieb:

    Binär schreiben geht mit fwrite. Die '1' und das '\n' bekommst du mit fprintf oder fputc in die Datei.

    Ich bin leider nicht ein C-Genie...
    Könntest du mir bitte einen simpeln Beispiel Code schrieben, dass ich das in meinen Code umsetzen könnte?
    Ich habe noch nie mit fputc gearbeitet und wenn ich fwrite benütze sagt mein Compiler "Too few arguments" 😮

    Danke an allen für die schnellen Antworten!
    Lg Rogon



  • Hier nochmal den Code ohne die Kommentare (für besseres Verständniss):

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    
    int main()
    {
    char string[200] = "";
    FILE* datei;
    
    if( (datei = fopen("file.bin", "ab+")) == NULL)
    {
    printf( "Fehler: Datei existiert nicht");
    getch();
    return 0;
    }
    
    else
    {
    printf("Die Datei existiert");
    }
    
    scanf(datei, "%s", &string);
    fprintf(datei,"Schreibe etwas in die Datei: ");
    fwrite(datei,"%s", string); //Hier gibts noch ein Fehler im Compiler
    
    printf(datei,"%s", string);
    fclose(datei);
    
    return 0;
    }
    


  • Rogon schrieb:

    fwrite(datei,"%s", string); //Hier gibts noch ein Fehler im Compiler
    

    http://www.cplusplus.com/reference/clibrary/cstdio/fwrite/



  • Ah, ok.

    Du möchtest die Zahl im Dualsystem ausgeben.

    Wenn du die Datei ansiehst, sollen dort '0' und '1' zu sehen sein.

    Unter binäre Speicherung versteht man das Format, wie die Zahlen im Rechner abgelegt sind.

    Eine Funktion die Werte zur Basis 2 asugibt gibt es im Standard-C nicht.
    Die musst du dir selber schreiben.

    Dazu brauchst du auch kein fwrite.
    Bei deiner Fehlermeldung hast du fwrite verkehrt aufgerufen.
    Du kannst dir die C-Funktionen z.B: bei www.cplusplus.com/reference/clibrary/ ansehen. Dort gibt es auch einige Beispiele.

    Und wenn du dir auch andere Beiträge im (Unter-)Forum durchliest, findest du auch http://www.c-plusplus.net/forum/305432 von gestern abend.
    Der hat fast dein Problem, nur mit Hex-Zahlen. Schau dir mal die Links dort an.

    Tipp: Dual ist Basis 2, Dezimal ist Basis 10 und Hexadezimal ist Basis 16.



  • Jetzt habe ich deinen neuen Code glatt übersehen.
    Zeile 23, 25 und 27 sind immer noch falsch.

    Bei deinen Fehlern gibt der Compiler auch Warnungen, wenn nicht sogar Fehlermeldungen. Auch die Warnungen sind wichtig.



  • WOAAAAAAAH! 😮
    Es funtioniert fast!

    Hier mein aktueller Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    
    int main()
    {
    
    char string[200] = "";
    
    FILE* datei;
    
    if( (datei = fopen("file.bin", "ab+")) == NULL)
    {
    printf( "Fehler: Datei existiert nicht");
    getch();
    return 0;
    }
    
    else
    {
    printf("Die Datei existiert");
    }
    
    scanf(datei, "%s", &string);
    
    printf("\nSchreibe etwas in die Datei: ");
    scanf("%s", string);
    fputs(string, datei);
    fclose(datei);
    
    return 0;
    }
    

    Jetzt kann ich einschreiben!
    Und das funktioniert gut!

    Es ist einfach das Problem, das es nicht Binär ist 😕
    Wie kann ich die Daten Binär einschreiben?

    Lg Rogon



  • Rogon schrieb:

    Wie kann ich die Daten Binär einschreiben?

    Dazu musst Du mit fwrite schreiben.



  • Rogon schrieb:

    Es ist einfach das Problem, das es nicht Binär ist 😕
    Wie kann ich die Daten Binär einschreiben?

    Lg Rogon

    Was erwartest du, du schreibst genau das in die Datein rein, das du auch eintippst. Wenn du 1111101 eingibst, steht das dann auch in der Datei.

    Aber egal, was du da eingibst, ist das erstmal eine Zeichenkette und noch keine Zahl mit der dur rechnen kannst.

    Rogon schrieb:

    Wie kann ich die Daten Binär einschreiben?

    DirkB schrieb:

    Eine Funktion die Werte zur Basis 2 ausgibt, gibt es im Standard-C nicht.
    Die musst du dir selber schreiben.

    Ich habe dir auch einen Link auf ein ähnliches Thema hier im Forum gepostet.

    @Belli:
    Er will die nicht binär haben.
    Er will eine binäre Darstellung.
    Im Prinzip ein %b für printf(), damit dann z.B. "1111101" rauskommt



  • DirkB schrieb:

    @Belli:
    Er will die nicht binär haben.
    ...

    ICH weiß das. Ich glaube, Du hast schon zwei, drei Postings vorher versucht, IHM das auch klarzumachen. Aber er fragt immer danach und ich bin kein Kindergärtner.



  • Ok, entschuldige.

    Aber wenn er da nochmal fwrite reinschreibt, kann ihm auch keine Kindergärtner mehr helfen.

    Ein Buch (für Rogon) und viel Geduld (von Rogon) mögen Wunder wirken (bei Rogon).



  • Also, ich habe jetzt fputs und es funtioniert alles!

    Weiss jemand aber wie man Binär in C umsetzt?

    Also es ist ja zahl/2 bis es 0 ist!
    Aber wie setzt man das in C um?

    Ich habe foldendes versucht:

    int zahl = 125;
    
    while(zahl/2 != 0){
    		if(zahl%2 > 0)
    		{
    		    printf("0");
    		}
    		else
    		{
    		    printf("1");
    		}
            zahl = zahl/2 - ((zahl/2)%2);
        }
    printf("0");
    }
    

    Was mache ich falsch?

    Lg Rogon 😃



  • Rogon schrieb:

    Was mache ich falsch?

    Lg Rogon 😃

    Du gibst die falsche Fehlerbeschreibung: http://www.c-plusplus.net/forum/136013

    Was passiert und was erwartest du?

    Was kann man in dem Programm falsch machen?
    - Abbruchbedingung
    - berechnung des neuen Wertes
    - falsche Reiehenfolge
    - falsche Vorstellung was passiert.

    Ich denke 4 von 4 hast du.



  • Es geht!!

    Hier mein Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    
    int main()
    {
    
    fopen("datei", "ab+");
    
    char eingabe [10];
    
    FILE* datei;
    
    if( (datei = fopen("file.giomizer", "ab+")) == NULL)
    {
    printf( "Fehler: Datei existiert nicht");
    getchar();
    return 0;
    }
    
    else
    {
    printf("Datei bereit!\n");
    }
    
    printf("Geben Sie eine Zahl zwischen 0 und 255 ein\n");
    scanf("%s", eingabe);
    
    fputs(eingabe, datei);
    fputs(" ", datei);
    
    int number;
    
        int rest;
        int y;
    
        for(y = 0; y >= 0; y--) {
        while(y < 7)
        {
            rest = number/(1 << y);
    
            number = number - rest * (1 << y);
            y++;
                fputs(rest, datei);
        }
    
        fputs(" ", datei);
    
    int test = eingabe;
    
        if
            (test == 0) {
                fputs("0", datei);
            }
    
            else if  (test == 2) {
                fputs("1", datei);
            }
    
            else if  (test == 1) {
                fputs("0", datei);
            }
    
            else if  (test%2 == 0) { //Modulo
                fputs("0", datei);
            }
    
            else if  (test%3 == 0) {
                fputs("0", datei);
            }
    
            else if  (test%4 == 0) {
                fputs("0", datei);
            }
    
            else if  (test%5 == 0) {
                fputs("0", datei);
            }
    
            else if  (test == 3) {
                fputs("1", datei);
            }
    
            else if  (test == 5) {
                fputs("1", datei);
            }
    
            else if  (test == 7) {
                fputs("1", datei);
            }
    
        else{
        fputs("1", datei);
        }
    
        fputs("\n", datei);
    
        fclose(datei); //wichtig: FILE* muss wieder geschlossen werden
    return 0;
    }}
    

    Danke an allen für eure Hilfe!
    Ihr seit super!

    Lg Rogon



  • Rogon schrieb:

    Ihr seit super!

    www.seitseid.de

    Abgesehen davon ist der Code auf unterirdischem Niveau und Du solltest dringend mit einem der empfohlenen Bücher oder Tutorials nochmal bei den absoluten Grundlagen beginnen...


  • Mod

    Wie dir in einem anderen Thread schon gesagt wurde, ist deine Lösung voller Fehler. Dass sie funktioniert ist reinstes Glück (oder Pech, denn so merkst du den Fehler erst durch Vorführeffekt). Zeile 48 ist feinstes undefiniertes Verhalten, Zeile 53 macht nicht einmal entfernt das was du denkst. Ehrlich gesagt kann ich gar nicht nachvollziehen, wie dies auch nur in irgendeinem Fall funktionieren soll, nicht einmal der Möchtegerndebugmodus einer bekannten IDE (der meiner Meinung nach eher Fehler versteckt als aufdeckt) wird dieses Programm zum Funktionieren bringen.

    Außerdem ist die ganze Grundidee des Algorithmus Müll.


Anmelden zum Antworten