Java, textdokument in zweidimensionalen Array speichern und ausgeben?
Hey, bei meiner dieswöchigen Informatik Übung müssen wir ein Spielfeld aus einem Textdokument in ein Zweidimensionales Array einlesen und ausgeben.
Ein Textdokument sieht zB so aus:
Ich hätte die Aufgabe mit folgendem Code gelöst:
[CODE]
class Input {
public static void main(String[] args) {
Input x = new Input();
x.openup("MazeWithExit_windows.txt");
}
void openup(String fileName) {
In.open(fileName);
int height = In.readInt();
int length = In.readInt();
Out.println("Height: " + height);
Out.println("Length: " + length);
char [][] a = new char[length][height];
for(int i=0;i<a.length;i++) {
for(int j =0;j<a[i].length;j++) {
a[i][j] = In.read();
Out.print(a[i][j]);
}
}
In.close();
}
}
[/CODE]
Die In und Out Klassen müssen wir verwenden.. Out.print statt System.Out.print
Und In hilft beim einlesen.
So, jetzt zum eigentlichen Problem..
Ansich funktioniert der Code, jedoch liest er auch newlines ein, weshalb das Array vorzeitig voll ist und nicht das ganze Spielfeld einliest.
Ausgabe: https://pastebin.com/czTDF2MA
Uns wurde gesagt, man soll einfach ein dummy-read reinmachen, was die newlines einliest und diese somit nicht zum Array hinzugefügt werden. Jemand hat auch gemeint, dass nach der inneren Schleife ein In.readLine(); das Problem löst.
Doch nichts hat mit geholfen.
Wie löse ich das Problem? :o
2 Antworten
Die Zeilentrenner müssen natürlich auch gelesen werden. Dabei kommt es natürlich auf die richtige Stelle im Code an:
for(int i=0;i<a.length;i++) {
if (In.read()!='\n')
Out.println("Fehler in Zeile "+(i+1)+
": Zeilentrenner fehlt!");
for(int j =0;j<a[i].length;j++) {
a[i][j] = In.read();
Out.print(a[i][j]);
}
Out.print('\n');
}
In.close();
Beachte, dass Du auch den Zeilentrenner nach der Breite und Höhe lesen musst. Deshalb habe ich das vor die innere Schleife gesetzt.
Mit dem zusätzlichen In.read() werden die Zeilentrenner gelesen. Damit sollte das In.read() in der inneren Schleife nur noch die „richtigen“ Zeichen einlesen.
Allerdings weiß ich nicht, welchen Typ In hat. Im Idealfall ist es ein Text-File, der plattformabhängige Zeilentrenner automatisch in ein einzelnes '\n' umwandelt. Aber wenn es nur ein Binary-File ist und die Datei im DOS- oder Mac-Format gespeichert ist, musst Du evtl. für jeden Zeilentrenner zwei Zeichen einlesen.
Ja, Dein Problem sind die NewLines, die Du mitliest.
Lösungsmöglichkeit:
Nutze die Funkrion readline(), so dass Du ne ganze Zeile auf einmal bekommst. Dann musst du halt die einzelnen Zeichen in dein Feld a übertragen. (btw. gib dem armen feld doch einen sprechenderen Namen)
Alternativ kannst du die Zeichen am Ende der Zeile auch "überlesen". Aber Achtung, je nach System und Textdateiformt, kommen da entweder ein "LineFeed" oder "Carriage Return" und ein "Line Feed".
Das Verwenden der readline() Funktion wäre hier ratsamer.
Hey, ich verstehe nich recht, was dieser Code genau verändert.. letztendlich bestehen die newlines doch oder?