Zahlen aus txt.-Datei in zweidimensionales Array einlesen



  • Hallo,

    ich habe schon einiges ausprobiert und viel im Internet gesucht, aber noch keine funktionierende Lösung für obiges Problem gefunden.

    Wahrscheinlich mach ich nur ne Kleinigkeit Falsch (hoffentlich), aber die ist dann wohl ausschlaggebend.

    Es handelt sich um ein Sudoku-Spiel.
    Ich habe eine txt.-Datei erstellt und mehrere Sudokus reingeschrieben (0 ist dabei eine Lücke):

    0 0 0 2 0 1 0 0 0 6 0 0 0 0 0 4 8 0 8 3 0 6 0 4 0 0 0 0 0 0 0 2 6 3
    0 0 7 0 0 3 0 5 0 0 2 0 0 2 7 4 0 0 0 0 0 0 0 5 0 7 0 4 1 0 7 9 0 0
    0 0 0 8 0 0 0 1 0 8 0 0 0
    0 0 6 0 7 0 0 0 0 0 3 0 1 0 0 0 0 7 0 5 7 0 0 3 0 0 1 0 0 4 8 0 5 0
    0 0 0 0 1 7 0 4 3 0 0 0 0 0 9 0 6 8 0 0 5 0 0 3 0 0 7 2 0 8 0 0 0 0
    7 0 4 0 0 0 0 0 5 0 6 0 0
    3 0 0 0 0 0 0 0 0 0 9 0 2 0 0 8 1 0 0 0 0 0 4 6 5 7 0 0 7 9 0 0 0 0
    0 2 0 0 5 0 0 0 9 0 0 2 0 0 0 0 0 6 8 0 0 4 3 7 5 0 0 0 0 0 2 8 0 0
    9 0 6 0 0 0 0 0 0 0 0 0 8

    zwischen den Zeichen ist jeweils ein Leerzeichen und zwischen den einzelnen Sudokus ein Enter.

    Jetzt soll mithilfe einer Zufallsfunktion eins der 3 Spiele eingelsen und angezeigt werden.
    Irgendwie gibt er aber immer das dritte Sudoku aus.

    Hier mein Quelltext für die Funktion:
    _______________________________________________________________________________

    bool oeffnen (int feld[9][9], char lms)
    {
    ifstream datei;

    if (lms == 'l')
    {
    datei.open ("Leicht.txt", ios::in);
    }

    if (lms == 'm')
    {
    datei.open ("Mittel.txt", ios::in);
    }

    if (lms == 's')
    {
    datei.open ("Schwer.txt", ios::in);
    }

    if (!datei.is_open())
    {
    return false;
    }

    srand(static_cast<int>(time(NULL)));
    unsigned int u = rand()%3*81;

    cout << "\n\n" << u << "\n\n";

    for (int q=u; q<u+81; q++)
    {

    for (int i=0; i<9; i++)
    {
    for (int j=0; j<9; j++)
    {
    datei >> feld[i][j];
    }
    }
    }

    datei.close();

    return true;
    }

    ______________________________________________________________________________

    Und die entsprechende Ausgabe:
    ______________________________________________________________________________

    ________________________________________________
    | |
    | *** Willkommen bei Sudoku *** |
    \______________________________________________/

    [N/n] Spiel starten.
    [E/e] Eigenes Spiel eingeben
    [B/b] Beenden

    Welchen schwierigkeitsgrad wuenschen Sie?

    Leicht [L/l]
    Mittel [M/m]
    Schwer [S/s]

    Eigene[E/e]

    m

    81

    81

    Spiel wird gestartet.

    81

    Spalten

    1 2 3 4 5 6 7 8 9

    ------------ ----------- ------------
    1 | 3 | | || | | || | | |
    ------------ ----------- ------------
    2 | | 9 | || 2 | | || 8 | 1 | |
    ------------ ----------- ------------
    3 | | | || | 4 | 6 || 5 | 7 | |
    ------------ ----------- ------------
    ------------ ----------- ------------
    4 | | 7 | 9 || | | || | | 2 |
    ------------ ----------- ------------
    Zeilen 5 | | | 5 || | | || 9 | | |
    ------------ ----------- ------------
    6 | 2 | | || | | || 6 | 8 | |
    ------------ ----------- ------------
    ------------ ----------- ------------
    7 | | 4 | 3 || 7 | 5 | || | | |
    ------------ ----------- ------------
    8 | | 2 | 8 || | | 9 || | 6 | |
    ------------ ----------- ------------
    9 | | | || | | || | | 8 |
    ------------ ----------- ------------
    ___________________________________________________________________

    (sieht bei mir schön formatiert aus... denkt's euch einfach ;))
    Das was mich verwirrt ist die mehrfache Ausgabe von u (kann 0, 81 oder 162 sein) also muss die random funktion laufen. irgendwas am speichern in's Array läuft wohl schief..

    Hoffe mir kann wer helfen und fühlt sich nicht von dem vielen Text erschlagen 🙂



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x, bzw. C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Eddy131 schrieb:

    for (int q=u; q<u+81; q++) 
     { 
    
     for (int i=0; i<9; i++) 
     { 
     for (int j=0; j<9; j++) 
     { 
     datei >> feld[i][j]; 
     } 
     } 
     }
    

    Die variable q wird bei dir nur zum hochzählen benutzt, aber du hast nirgendwo einen offset drin (außer, wenn ich was übersehe).

    statt zu machen

    for(int q = u; q < u +81; q++)
    

    könntest du genauso

    for(int q = 0; q < 81; q++)
    

    schreiben, das würde genau das gleiche machen.

    Deshalb wird immer das gleiche eingelesen.

    Du musst ja schon je nach wert von u von einer anderen stelle in der datei aus einlesen.



  • Ich weiß.

    Das war halt mein Lösungsansatz.

    Ich wollte damit erreichen, das ab der Stelle von u angefangen wird zu lesen und das ab dem Zeichen dann die nächsten 81 Zeichen eingelesen werden (also 9x9=81 => Anzahl an Sudoku Feldern)
    Und das haut ja leider nicht hin.

    Ich hab deine Änderungen eingesetzt, leider hat sich an der Ausgabe nichts geändert. Nur das jetzt für u IMMER 81 ausgegeben wird (also keine 0 und 162 mehr; von diesen Stellen soll das Array ja anfangen).

    Ich will ja erreichen, das z.B. aus der Textdatei "Mittel.txt" ab dem 162. (0., 81. -> soll per Zufallsgenerator entschieden werden) Zeichen 81 Folgezeichen der Reihe nach in das Array "feld[9][9]" eingelesen werden soll.

    Was mir nicht gelingt ist die Zuweisung des Startwerts, und den Befehl um Das momentane Zeichen in das Array zu speichern.

    Noch ne Frage: sollte ich für die Übergabe des Arrays aus der main-Funktion in die Funktion eine call-by-reference (feld[9][9]) oder eine call-by-value (&feld[9][9]) Variable nehmen?

    Aber Danke für die Hilfe 👍

    Sollten noch Fragen sein um mir helfen zu können (klingt irgendwie seltsam... 😛 ), dann helfe ich gerne weiter.

    MfG



  • Ich muss mich korrigieren, u gibt nach vor die Zahlen 0, 81 und 162 aus.
    Bei mir hast halt mehreren Durchläufen immer die 81 gekommen, da bin ich dann fälschlicherweise davon ausgegangen.

    Jetzt nach erneutem Prüfen sind dann auch die anderen Werte ausgegeben worden.



  • Eddy131 schrieb:

    Ich hab deine Änderungen eingesetzt [...]

    Falls du die andere Variante der for-Schleife meinst - das war kein Änderungsvorschlag, das sollte dir nur zeigen, was deine for-schleife (nicht) macht.

    Du könntest z.B. erstmal bis zu der stelle an der du wirklich lesen willst alles in eine dummy variable einlesen und dann erst ins array einlesen.

    Sagen wir q ist der index, ab dem du wirklich einlesen willst, dann könntest du erstmal mit

    for(int i = 0; i < q; ++i)
    {
       int dummy;
       datei >> dummy;
    }
    

    In der Datei zur richtigen Stelle gelangen und dann wie vorher das array einlesen von der richtigen stelle aus.

    Normalerweise benutzt man für sowas zwar die ignore methode oder sogar random access files, aber so ist es vermutlich am einfachsten.

    Edit: Du kannst ja die aktuelle version der for-schleifen nochmal zeigen und erklären, was du dir bei gedacht hast und was schief läuft.



  • Jatzt hab ich verstanden was du meinst!

    Danke.

    Ich hab jetzt die Variante mit der Dummy-Variablen ausprobiert, aber das Programm scheint immer noch nicht zu wissen, was ich will.
    Er gibt immer noch das gleiche Sudoku aus.
    Hier mal der aktuelle Quellcode:

    srand(static_cast<int>(time(NULL)));
    unsigned int u = rand()%3*81;

    cout << "\n\n" << u << "\n\n";

    for(int i=0; i<u; i++)
    {
    int dummy;
    datei >> dummy;
    }

    for (int q=0; q<81; q++)
    {
    for (int i=0; i<9; i++)
    {
    for (int j=0; j<9; j++)
    {
    datei >> feld[i][j];
    }
    }
    }

    Er zählt ja jetzt in der Datei bis zum zufällig gewählten "u" und überschreibt damit immer wieder den Dummy. Dann merkt er sich doch die Position, die er in der Datei hat (oder?) und startet dann bei der folgenden For-Schleifen- Kombination von der Stelle. Hab ich das so richtig verstanden?
    Dann sollte es so aber klappen, tut es leider nicht 😞

    Was muss ich noch berücksichtigen, damit es klappt?

    Bis jetzt aber Danke, hat mir sehr geholfen! 👍 🙂



  • Hab's hinbekommen!
    Ich hab die äußerste for Schleife einfach wegmachen müssen.
    Die hat wohl immer noch bis zum ende durchgezählt und dadurch kamm immer das dritte Spiel.

    Hier der funktionierende QC:

    srand(static_cast<int>(time(NULL)));
    unsigned int u = rand()%3*81;

    cout << "\n\n" << u << "\n\n";

    for(int i=0; i<u; i++)
    {
    int dummy;
    datei >> dummy;
    }

    for (int i=0; i<9; i++)
    {
    for (int j=0; j<9; j++)
    {
    datei >> feld[i][j];
    }
    }

    datei.close();

    return true;

    Danke für die Hilfe Q!


Anmelden zum Antworten