Zum Inhalt springen

Speicherzugriffsfehler beim lesen von txt Datei


Empfohlene Beiträge

Geschrieben

Guten Tag allerseits,

ich soll ein Programm schreiben welches Zahlen aus einer txt Datei ausliest und zu einem Sudoku zusammensetzt. Die Verarbeitung der Zahlen, Regeln, etc. ist alles schon fertig jedoch krieg ich jedes Mal ein "Speicherzugriffsfehler". Ein ähnlicher Fall hab ich hier schonmal gesehen und hatte gehofft hier eine Antwort zu finden. Ich vermute es liegt an meinem Speichermanagment aber leider komme ich nicht auf den Fehler. Ich hab fgets/fscanf mit realloc/free probiert aber kein Erfolg.
Meine Main sieht so aus:

char* zeile_sudoku;
    char** inhalt_sudokus;

    //Speicher reservieren
    inhalt_sudokus=(char**)malloc(sizeof(char*)*anzahl_zeilen-1);
    for(a=0;a<anzahl_zeilen;a++){
        inhalt_sudokus[a]=(char*)malloc(sizeof(char)*81);
    }

    zeile_sudoku=(char*)malloc(sizeof(char)*81);

    sudoku_txt=fopen("Sudokus.txt"],"r");

    //Überprüfen ob die Datei überhaupt geöffnet werden konnte
    if(sudoku_txt==NULL){
        printf("Fehler beim lesen der Datei %s\n",argv[1]);
        return -1;
    }else{
        //Zeilenweise die txt datei auslesen udn einspeichern
        for(a=0;a<anzahl_zeilen;a++){
            fscanf(sudoku_txt,"%s\n",&inhalt_sudokus[a]);
            printf("%d:\t%s\n",a,inhalt_sudokus[a]);
            inhalt_sudokus[a]=realloc(inhalt_sudokus[a],strlen(inhalt_sudokus[a]));

        }
    fclose(sudoku_txt);
    }

printf("Herzlich Willkommen! Bitte eine Schwierigkeit auswählen\n");
    printf("1:\tSehr Einfach\n2:\tEinfach\n3:\tMittel\n4:\tSchwer\n5:\tSehr Schwer\n");
    scanf("%d",&auswahl_1);
    printf("Wollen sie das erste (1) oder zweite (2) Sudoku spielen?\n");
    scanf("%d",&auswahl_2);

    //Die zweite Auswahl überprüfen
    if(auswahl_2!=1 && auswahl_2!=2){
        printf("Eingabe unbekannt! Abbruch!\n");
        return -1;
    }

    //Die richtige Zeile auswählen basierend auf der Wahl des Benutzers
    switch(auswahl_1){
    case 1:         //Sehr Einfach (Zeile 1+3)
        switch(auswahl_2){
        case 1:zeile=2;
        break;
        case 2:zeile=3;
        break;
        }
        break;
    case 2:         //Einfach (Zeile 6+8)
        switch(auswahl_2){
        case 1:zeile=5;
        break;
        case 2:zeile=6;
        break;
        }
        break;
    case 3:         //Mittel (Zeile 11+13)
        switch(auswahl_2){
        case 1:zeile=8;
        break;
        case 2:zeile=9;
        break;
        }
        break;
    case 4:         //Schwer (Zeile 16+18)
        switch(auswahl_2){
        case 1:zeile=11;
        break;
        case 2:zeile=12;
        break;
        }
        break;
    case 5:         //Sehr Schwer (Zeile 21+23)
        switch(auswahl_2){
        case 1:zeile=15;
        break;
        case 2:zeile=16;
        break;
        }
        break;
    default:
        printf("Eingabe unbekannt! Abbruch!\n");
        return -1;
        break;
    }

zeile_sudoku=inhalt_sudokus[zeile];

    for(a=0;a<anzahl_zeilen;a++){
        free(inhalt_sudokus[a]);
    }

    laenge_zeile=strlen(zeile_sudoku);
    printf("Erfolg nach Strlen\n");

    //Den String Zeichenweise in Int umwandeln
    c=0;
    for(a=0;a<9;a++){
        for(b=0;b<9;b++){
            sudoku[a]=(zeile_sudoku[c])-'0';
            if(sudoku[a]==0){freie_felder++;}
            c++;
        }
    }

    free(zeile_sudoku);

//Noch mehr Programm welches kein dyn. Array mehr benutzt

 

Ich öffne die C Datei in der Linux Konsole wie folgt:
gcc Sudoku.c
./a.out 

Folgendes passiert in der Konsole:
0:    sehr
1:    einfach:
2:    076194380504783296938052174625941837490328051000576409169237548053419700042065910
3:    162983574745612398098547216004008001231765080907401652023170905019324867476059123
4:    Einfach:
5:    009207405500086001102540900020090008007000600900760032000001706000052004601409200
6:    040075098900680200783219050078521469024908710510060002492756800105043007807100040
7:    Mittel:
8:    400629000600570030021030005000890000048300279000054100200045801060003004004102007
9:    080060070009074000060008000290650000800047000400892050008230900340080165900000830
10:    Schwierig:
11:    207040000000500009000000010006100300000900200080000000000082700950000000000000000
12:    000000000000060001305000040080000900009000050000100300100000000000003000260800004
13:    Sehr
14:    Schwierig:
15:    100008700060031000305000000008090006006000500400070300000000804000960030009400001
16:    050000406309000080076000002000000037000064500000090200500032000040100000908500000

Herzlich Willkommen! Bitte eine Schwierigkeit auswählen
1:    Sehr Einfach
2:    Einfach
3:    Mittel
4:    Schwer
5:    Sehr Schwer
1
Wollen sie das erste (1) oder zweite (2) Sudoku spielen?
1
Speicherzugriffsfehler
 

Ich würde mich um jede Hilfe freuen.
Gruß Leo

Geschrieben (bearbeitet)

eventuell das doppelte free?

vor 7 Stunden schrieb noob4326:

zeile_sudoku=inhalt_sudokus[zeile];

tut nicht das was du vermutlich erwartest. ich bekomm den SegFault allerdings erst beim 2ten "free".

P.S.: gcc -g -Wall Sudoku.c

Bearbeitet von _n4p_

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...