Warum funktioniert dieses Speichern in Array nicht?

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

  • Warum funktioniert dieses Speichern in Array nicht?

    Hallo,

    versuche gerade folgende Hausarbeit zu lösen: Erstellen Sie eine Klasse DatenEingabeDatei, welche die Datensätze ausder Textdatei in ein zweidimensionales Array einliest.

    Die Textdatei ist so aufgebaut, das Sie immer 5 Spalten (getrennt durch "\t") mit Daten hat und jede Zeile (beendet durch "\n") für einen Artikel steht. Also zum Beispiel so:

    Buch Parfüm 12345 12.99 0
    CD Java 54575 6.99 1


    Die Methode, die ich dazu geschrieben habe, steigt immer in den for-Schleifen des StringTokenizers mit einer NoSuchElementException aus. Ich habe wirklich alles probiert und überall gelesen, komme leider nicht weiter. :( Bitte helft mir, diese Methode zum Laufen zu bringen, finde den Fehler einfach nicht! :roll:

    Quellcode

    1. static void DatenEingabeDateiFL()
    2. {
    3. try
    4. {
    5. /*Dieser Methodenbereich zählt die Anzahl der Zeilen in
    6. *der Textdatei. Diese Anzahl entspricht somit der Anzahl
    7. *der Datensätze
    8. */
    9. FileReader frFL = (new FileReader("c:/testdatei.txt"));
    10. int cFL;
    11. while( (cFL=frFL.read()) != -1)
    12. {
    13. if( (cFL=frFL.read()) == 10) //10 ist der Character-Code von \n
    14. {
    15. ++anzahlFL;
    16. }
    17. }
    18. artikelFL = new String[anzahlFL][5]; //Anlegen des Arrays nach Anzahl der Datensätze
    19. /*Dieser Methodenbereich schreibt die eingelesenen Datensätze in
    20. *das zuvor angelegte Array*/
    21. BufferedReader brFL = new BufferedReader(new FileReader("c:/testdatei.txt"));
    22. String sFL = new String();
    23. String wertFL = "";
    24. while( (sFL=brFL.readLine()) != null)
    25. {
    26. StringTokenizer stFL = new StringTokenizer(sFL);
    27. while(stFL.hasMoreTokens())
    28. {
    29. for(int iFL=0;iFL<anzahlFL; iFL++)
    30. {
    31. for(int jFL=0; jFL<5; jFL++)
    32. {
    33. wertFL = stFL.nextToken();
    34. System.out.println(wertFL);
    35. //System.out.println("anzahlFL="+anzahlFL);
    36. //System.out.println("iFL="+iFL+"\tjFL="+jFL);
    37. artikelFL[iFL][jFL] = wertFL;
    38. }
    39. }
    40. }
    41. }
    42. brFL.close();
    43. }
    44. catch(FileNotFoundException e)
    45. {
    46. System.out.print("Datei nicht gefunden!");
    47. }
    48. catch(IOException e) {}
    49. }
    Alles anzeigen


    Für Eure Hilfe wäre ich echt sehr dankbar!!!!

    Gruss CarRacer
    Dateien
    • testdatei.txt

      (26 Byte, 275 mal heruntergeladen, zuletzt: )
  • "java.sun.com" schrieb:

    StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.


    Lieber "string".split() benutzen.

    Also ich würde es so machen:
    Du splittest den Inhalt der Textdatei bei neuen Zeilen (\n), dann hast du ein String Array aller Zeilen. Das gehst du iterativ durch und splittest jede Zeile durchs Tab, dann hast du eigentlich was du willst. Das sollte einigermaßen schnell und übersichtlich zu programmieren sein, dein Code ist leider (trotz Kommentare) schwer verständlich (3 Schleifen, komische Variablennamen)
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Hi

    Erst mal ne Frage warum du einmal mit nem FileReader und einmal mit nem BufferedReader die Datei liest?
    Also ich würde empfehlen nur den BufferedReader verwenden.
    Als nächstes solltest du vielleicht besser hingehen und deine Textdatei in ein File-Objekt legen und das dem FileReader/BufferedReader geben. Kannst bei File auch prüfen ob die Datei existiert und noch ein paar andere Späße

    Quellcode

    1. File file = new File("c:/testdatei.txt");
    2. BufferedReader bfFL = new BufferedReader(new FileReader(file));


    So und nun zu deinem eigentlichen Fehler.
    Du hast nen kleinen Denkfehler drinnen.

    Quellcode

    1. while( (sFL=brFL.readLine()) != null)
    2. {
    3. StringTokenizer stFL = new StringTokenizer(sFL);
    4. while(stFL.hasMoreTokens())
    5. {
    6. for(int iFL=0;iFL<anzahlFL; iFL++)
    7. {
    8. for(int jFL=0; jFL<5; jFL++)
    9. {
    10. wertFL = stFL.nextToken();
    11. System.out.println(wertFL);
    12. //System.out.println("anzahlFL="+anzahlFL);
    13. //System.out.println("iFL="+iFL+"\tjFL="+jFL);
    14. artikelFL[iFL][jFL] = wertFL;
    15. }
    16. }
    17. }
    Alles anzeigen


    Du liest mit readLine() eine ZEILE aus der Datei und versuchst direkt mit der einen ZEILE dein ganzes Array zu füllen.

    Quellcode

    1. int iFL = 0;
    2. while(stFL.hasMoreTokens())
    3. {
    4. for(int jFL=0; jFL<5; jFL++)
    5. {
    6. wertFL = stFL.nextToken();
    7. System.out.println(wertFL);
    8. //System.out.println("anzahlFL="+anzahlFL);
    9. //System.out.println("iFL="+iFL+"\tjFL="+jFL);
    10. artikelFL[iFL][jFL] = wertFL;
    11. }
    12. iFL++;
    13. }
    Alles anzeigen


    auch nicht ganz gelungen ist

    Quellcode

    1. while(stFL.hasMoreTokens())


    aber das ist ein anderes Thema
    mfg
    cr4ch

    P.S.
    Ich hätte das ganze wahrscheinlich mit ner ArrayList gelöst.
    Das ganze würde dann ungefähr so aussehen.
    Achtung die Methode selber macht bei mir keine Ausgaben.

    Quellcode

    1. public ArrayList DatenEingabeDateiFL(){
    2. ArrayList<String[]> list = new ArrayList<String[]>();
    3. StringTokenizer stFL;
    4. String einlesen;
    5. File f = new File("C:/Dokumente und Einstellungen/c.altmeier/Eigene Dateien/testdatei.txt");
    6. try{
    7. BufferedReader reader = new BufferedReader(new FileReader(f));
    8. while((einlesen = reader.readLine()) != null){
    9. stFL = new StringTokenizer(einlesen);
    10. String[] artikel = new String[stFL.countTokens()];
    11. for (int i = 0; i < artikel.length; i++) {
    12. artikel[i] = stFL.nextToken();
    13. }
    14. list.add(artikel);
    15. }
    16. reader.close();
    17. }
    18. catch(FileNotFoundException e)
    19. {
    20. System.out.print("Datei nicht gefunden!");
    21. }
    22. catch(IOException e) {
    23. }
    24. return list;
    25. }
    Alles anzeigen
  • Hallo cr4ch,
    Hallo SeBa

    vielen Dank, hab´s mit Euren Tipps jetzt tatsächlich zum laufen bekommen! :D
    Naja, die blöden Variablennamen sind Vorgaben vom Prof. Beim ersten Durchlauf benutze ich den FileReader, um die nach dem Charachter Unicode 10 zu suchen. Damit habe ich die Anzahl der Zeilen der Textdatei ermittelt. Anschließend mit BufferedReader um eben den StringTokenizer benutzen zu können. Hast aber schon recht cr4ch, ist nicht gerade elegant.

    Bin gerade dabei das Ganze jetzt zusätzlich mit dem Tipp von SeBa (string.split()) zu basteln.

    Nochmal vielen Dank!

    Grüsse
    CarRacer