Mit Semikolon separierte Werte aus einer Datei in ein Array schreiben.



  • Hallo alle zusammen!

    Kennt jemand von Euch eine Möglichkeit, wie man eine Datei nach dem folgenden Schema in ein Array liest?

    22
    1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
    1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
    1,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,1
    1,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,1
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1
    1,12,0,0,0,0,0,0,0,0,0,0,0,0,13,1,1,1,1,0,0,1
    1,0,12,0,0,0,0,0,0,0,0,0,0,13,0,1,1,1,1,0,0,1
    1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1
    1,0,11,0,0,0,0,0,0,0,0,12,1,0,10,0,0,0,0,13,0,1
    1,11,0,0,0,0,0,0,0,0,12,0,1,10,0,0,0,0,0,0,13,1
    1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1
    1,12,0,0,0,0,0,0,0,0,13,0,1,11,0,0,0,0,12,1,1,1
    1,0,12,0,0,0,0,0,0,0,0,13,1,0,11,0,0,12,0,1,1,1
    1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1
    1,0,11,0,0,0,0,0,0,0,0,0,0,10,0,1,1,0,0,1,1,1
    1,11,0,0,0,0,0,0,0,0,0,0,0,0,10,1,1,0,11,0,0,7
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,0,0,0,7
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
    

    Die Datei besteht immer aus 22 Zeichen pro Zeile und 18 Zeilen. Ausgenommen die 22 am Anfang, die ignoriert werden sollen. Alle diese Zeichen sollen an ihre Position in ein 2-dimensionales Array gespeichert werden.

    Ich stehe momentan echt auf dem Schlauch und würde mich freuen, wenn jemand von Euch eine Idee hat.

    Gruß
    Kasimir


  • Mod

    Bei einigen der istream Funktionen kann man explizit Trennzeichen angeben, beispielsweise bei getline und bei ignore, die hier beide in Frage kommen. War es dies, womit du Schwierigkeiten hast? Oder liegt dein Problem eher darin, dass du Schwierigkeiten mit dynamischen Arrays hast?



  • mit was denn nun separiert?
    semikolon oder komma? ;o)

    also: es würde auch der op>> gehen
    und dann ne dummy-fkt, die das trennzeichen einliest...
    die könnte so gar auch noch nen fehlerbit im stream setzen, falls es ein falsches trennzeichen gibt...

    aber am besten, du zeigst mal, wie du vorgehen würdest!? bzw was du bisher schon hast und dann können wir dir immernoch sagen, was nicht so klug ist, was du anders machen solltest, was tol ist usw. ^^

    bb



  • ^^^komma natürlich. sorry, hab zu viele beispiele für csv gelesen.

    int map[22][18];
    
          ifstream infile;
          infile.open("test.snp", ifstream::in);
    
          char mapbuffer[22];
          infile.ignore(3, '22\n');
          for (int row = 0; row < 18; row++) {
              for (int col = 0; col < 22; col++) {
                  infile.getline(mapbuffer, sizeof(mapbuffer), ',');
                  int x = atoi(mapbuffer);
                  map[col][row] = x;
              }
          }
    

    unglaublich, es hat doch funktioniert was ich da mit ignore gebastelt habe ^^ naja fast 😕
    irgendwie ist die ausgabe von dem was ich da gerade gebastelt nicht ganz das was ich wollte. es fehlt nämlich in der ausgabe immer ein zeichen einer zeile... und ich kann mir nicht erklären warum 😕
    aber schon mal vielen dank für die guten tipps!



  • Hänge an jede Zeile halt ein ',' an (vorher CRLF entfernen).



  • die datei muss so gelesen werden wie sie ist und kann nicht verändert werden. ich hab sie aus einem StringGrid im Borland C++ Builder aber das Programm was ich nun schreibe hat damit nichts mehr zu tun.
    oder wie war das gemeint?

    [EDIT]: Ich habe jetzt doch im Boralnd C++ Builder dafür gesorgt, dass beim Speichern an jede Zeile ein ',' gehängt wird. Das wirkt sich zum Glück nicht auf das Laden der Datei im Editor aus, mit dem ich die Datei bearbeite.
    Nun funktioniert das Programm erstmal so wie ich es wollte. Danke für die Hilfe!



  • Um dynamisch zu bleiben, solltest du die erste Zahl einlesen und dann als maximale Spaltenanzahl interpretieren (anstatt fest auf 22 zu implementieren 😕 )

    Und dein "char mapbuffer[22];" ist auch sehr suspekt? Bei dir scheint wohl die 22 eine magische Konstante zu sein (ich dachte immer, es wäre die 23 oder 42 😉 )



  • da die map 22 spalten groß ist, dachte ich ich müsste da 22 eintragen. ich habe aber soeben herausgefunden, dass für die darstellung 3 reichen O.o.
    Da Spalten- und Zeilenanzahl gleich bleiben braucht das Array nicht dynamisch sein, oder welchen vorteil hätte das?

    Th69 schrieb:

    [...] Bei dir scheint wohl die 22 eine magische Konstante zu sein (ich dachte immer, es wäre die 23 oder 42 😉 )

    Bei mir wäre es eher die 47.



  • Nene 2 (oder noch besser 2*2) ist _die_ Lösung. :p

    Man glaubt kaum, wie oft das wirklich _die_ Lösung ist. (hat mal an einer Prüfung funktioniert)

    Da Spalten- und Zeilenanzahl gleich bleiben braucht das Array nicht dynamisch sein, oder welchen vorteil hätte das?

    Falls es sich doch eben mal ändert. Wenn das so ist, dann brauchst du nicht den ganzen Code umzuschreiben, sondern es läuft auch für andere Fälle. (mag in diesem Beispiel nach nonsense klingen, aber meistens ist eine allgemeine Lösung wirklich besser, als eine spezielle, da man sehr oft doch etwas ändern muss und dann ist man froh, wenn man nicht gleich den ganzen Code überarbeiten muss).


Log in to reply