einlesen einer datei und speichern in einem char[][]

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • einlesen einer datei und speichern in einem char[][]

    Hey Leute,

    wie in der Überschrift schon beschrieben möcht ich aus einer Datei lesen und den Inhalt Zeichenweise in einem char[][] speichern.
    Bsp.:
    die Datei hat den Inhalt:
    !"§$
    #+?§
    "§$

    diese Datei soll dann in einem char[][] gespeichert werden, genau so wie sie auch in der Datei steht.

    hab bis jetzt folgendes, der code scheint aber so nicht zu funktionieren.

    Quellcode

    1. try{
    2. FileReader in = new FileReader(level);
    3. int b;
    4. while ((b = in.read()) != -1)
    5. {
    6. for(int j=0;b != -1;j++)
    7. {
    8. for(int i=0;(char) b!= '\n';i++)
    9. {
    10. map[j][i]=((char)b);
    11. }
    12. }
    13. }
    14. in.close();
    15. }
    16. catch(IOException e)
    17. {
    18. System.err.println("Fehler beim Lesen von der Standardeingabe.");
    19. }
    Alles anzeigen


    kann mir jemand weiter helfen :)

    Mfg

    Edit von Hafner:
    Bitte die Code-Tags verwenden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von unique ()

  • Besser geht es mit einem String-Array und BufferedReader(kann Zeilen trennen)

    Ich würde Dir zu einem String-Array raten:

    /**
    * Textdatei zeilenweise in ein String-Array einziehen . <br/>
    * Jede Zeile bildet einen String im String-Array.<br/>
    *
    * @param pFile File-Object
    * @return String-Array
    */
    public static String[] fileToStrArr(
    final File pFile )
    {
    if ( pFile == null )
    {
    return null;
    }

    InputStreamReader isr = null;
    try
    {
    final FileInputStream fin = new FileInputStream(pFile);

    isr = new InputStreamReader( fin );

    BufferedReader defBufferedReader = new BufferedReader( isr );

    ArrayList strArrayList = new ArrayList();
    String readLine = null;

    while ((readLine = defBufferedReader.readLine()) != null) // bis zum Ende der Datei
    {
    strArrayList.add(readLine);
    } // end while

    final String[] retArr =
    arrayListToStrArr(
    strArrayList);

    return retArr;
    }
    catch (Exception e)
    {
    System.err.println( e.getMessage() );
    e.printStackTrace();
    throw new RuntimeException( e );
    }
    finally
    {
    IoUtil.closeCatched( isr );
    }
    // return null ;
    }

    /**
    * Reader schliessen mit Exception-Abfangung.
    *
    * @param pReaderzu schliessender Reader
    */
    public static final void closeCatched(
    final Reader pReader )
    {
    if ( pReader != null )
    {
    try
    {
    pReader.close();
    }
    catch (IOException e)
    {
    System.err.println( e.getMessage() );
    e.printStackTrace();
    }
    }
    }
  • danke für dein Bemühen, das sieht schon mal nicht schlecht aus.
    Dennoch brauch in den Dateiinhalt Zeichenweiße!
    hab das trotzdem mal nach deiner Weiße versucht und die Strings dann versucht in char umzuwandeln.

    Ich post mal den kompletten Code der Klasse...
    als Fehler Medung bekomme ich unter anderem IndexOutOfBounds, versteh aber nicht warum...


    Quellcode

    1. import java.io.*;
    2. import java.util.*;
    3. public class Level {
    4. private char[] map = new char[50];
    5. /**
    6. * @param map
    7. */
    8. public Level(String level) {
    9. super();
    10. readLevel(level);
    11. }
    12. /**
    13. *
    14. * @return
    15. */
    16. public char[] getMap(){
    17. return this.map;
    18. }
    19. /**
    20. *
    21. * @param level
    22. */
    23. public void readLevel(String level) {
    24. try{
    25. final FileInputStream fin = new FileInputStream(level);
    26. InputStreamReader isr = new InputStreamReader( fin );
    27. BufferedReader reader = new BufferedReader( isr );
    28. ArrayList strArrayList = new ArrayList();
    29. String readLine = null;
    30. while ((readLine = reader.readLine()) != null)
    31. {
    32. strArrayList.add(readLine);
    33. }
    34. reader.close();
    35. String[] line = new String[strArrayList.size()];
    36. for(int i=0;i<line.length;i++)
    37. line [ i ] =(String) strArrayList.get(i);
    38. for(int i=0;i<line.length;i++){
    39. char [] myMap = line[i].toCharArray ();
    40. map[i]=myMap[i];
    41. }
    42. }
    43. catch(IOException e) {
    44. System.err.println(e.getMessage());
    45. }
    46. }
    Alles anzeigen









    }

    komme einfach nicht weiter :(

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von unique ()

  • Ja kann ich.

    Aber fangen wir von forne an:
    1. ArrayList ist bei dir nicht Typisiert. Das sollte dir einen Warnung ausgeben. Da deine ArrayList Strings enthält, benutze sie besser so:

    Quellcode

    1. ArrayList<String> strArrayList = new ArrayList<String>();

    2. Warum machst du aus der Liste ein Array?

    Quellcode

    1. for(int i=0;i<line.length;i++)
    2. line [ i ] =(String) strArrayList.get(i);

    3. Was immer du hier tun willst. Das was dort steht kann nichts sinnvolles sein.

    Quellcode

    1. for(int i=0;i<line.length;i++){
    2. char [] myMap = line[i].toCharArray ();
    3. map[i]=myMap[i];
    4. }

    Wenn die Zeile 4 in deiner Datei z.B. nur 3 Zeichen hat, dann bekommst du hier eine ArrayIndexOutOfBoundsExeption bei myMap. Aber das spielt eh keine Rolle, weil die Schleife eh nichts tut was irgendwie gewollt sein könnte.
  • vielen Dank fürs helfen! War eigentlich viel einfacher als ich gedacht habe^^
    Bin etwas weiter gekommen:)

    zumindestends wird jetzt fast korrekt gelesen und angezeigt :)

    nur folgendes geht noch nicht: ich zeig mal zuerst die datei die eingelesen werden soll

    ####
    # .#
    # ###
    #*@ #
    # $ #
    # ###
    ####

    hinter der ersten Reihe sind aber noch 2 Leerzeichen das noch mit eingelsen werden sollen
    in der 2. Reihe ebenfalls!
    Das macht er noch nicht, jemand ne Idee wie man das noch implementieren kann?

    hier mein Code:

    Quellcode

    1. public void readLevel(String level) {
    2. try{
    3. FileReader in = new FileReader(level);
    4. int line;
    5. int i=0;
    6. while ((line = in.read()) != -1) {
    7. map[i]= (char) line;
    8. i++;
    9. }
    10. in.close();
    11. }
    12. catch(IOException e) {
    13. System.err.println(e.getMessage());
    14. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von unique ()

  • Wenn deine Datei mehr als 50 Zeichen hat (mit Zeilenumbrüchen) dann kracht es.
    Die Klasse File hat eine length()-Methode. Damit bekommst du die Dateigröße. Versuche doch mal so etwas:

    Quellcode

    1. File file = new File(level);
    2. map = new char[(int)file.length()]; // ich glaube du musst den long-Wert auf int casten
    3. FileReader in = new FileReader(file )

    Oben in der Klasse brauchst du die map dann nicht initialisieren:

    Quellcode

    1. private char[] map;
  • Jetzt mit richtiger Formatierung:

    Quellcode

    1. /**
    2. * Umwandeln des übergebenen String-Arrays
    3. * in ein zweidimensionales char-Array.
    4. */
    5. public class StringArrToCharArrArr
    6. {
    7. /**
    8. * Test-Main.
    9. *
    10. * @param args Kommandozeilenparameter
    11. */
    12. public static void main(
    13. final String[] args)
    14. {
    15. final String[] strArr =
    16. { "eins" , "zwei" , "drei" };
    17. for (int i = 0; i < strArr.length; i++)
    18. {
    19. String str = strArr[ i ];
    20. System.out.println( str );
    21. }
    22. System.out.println("---------------------");
    23. final char[][] charArrArr =
    24. strArrToCharArrArr(
    25. strArr );
    26. for (int i = 0; i < charArrArr.length; i++)
    27. {
    28. char[] charArr = charArrArr[ i ];
    29. final String str =
    30. new String(
    31. charArr );
    32. System.out.println( str );
    33. }
    34. }
    35. /**
    36. * Umwandeln des übergebenen String-Arrays
    37. * in ein zweidimensionales char-Array.
    38. *
    39. * @param strArr zeilenweises String-Array
    40. * @return zweidimensionales char-Array
    41. */
    42. private static char[][] strArrToCharArrArr(
    43. final String[] strArr)
    44. {
    45. final char[][] retCharArrArr =
    46. new char[ strArr.length ][ 0 ];
    47. for (int i = 0; i < strArr.length; i++)
    48. {
    49. final String str = strArr[ i ];
    50. final char[] strCharArr =
    51. str.toCharArray();
    52. retCharArrArr[ i ] =
    53. strCharArr;
    54. }
    55. return retCharArrArr;
    56. }
    57. }
    Alles anzeigen
  • danke für die Hilfe und Bemühugen !
    hab das jetzt so gelöst und läuft perfekt:

    Quellcode

    1. public void loadLevel(String level) {
    2. goals=0;
    3. FileReader in;
    4. try {
    5. in = new FileReader(level);
    6. BufferedReader reader = new BufferedReader(in);
    7. int c;
    8. int i = 0;
    9. int j = 0;
    10. while ((c = reader.read()) != -1) {
    11. field[j][i] = (char) c;
    12. if (c == '@' || c == '+') {
    13. playerPosX = i;
    14. playerPosY = j;
    15. }
    16. if(c=='.' || c=='*' || c=='+')
    17. goals++; //Zählt die vorhanden Ziele
    18. i++;
    19. if (c == '\n') {
    20. j++;
    21. i = 0;
    22. }
    23. }
    24. reader.close();
    25. }
    26. catch (FileNotFoundException e) {
    27. System.err.println("Die Datei \"" + level + "\" wurde nicht gefunden");
    28. }
    29. catch (IOException e) {
    30. e.printStackTrace();
    31. }
    32. }
    Alles anzeigen