Text Datei einlesen und ausgeben

sakizzo

Mitglied
Hallo!...

Kann mir jemand erklären, worin der Fehler in der WHILE-Schleife liegt?....
Ich hatte mir das so vorgestellt:
Während in der Datei Sachen stehen{ diese in out[0,1,2 etc] speichern und Ausgeben}

Was muss geändert werden, damit es funktioniert?Muss ich die Werte in ein Array packen?
Danke für die Antworten, sakizzo

Code:
import java.io.*;
import java.util.Scanner;

public class TxtEinlesen {
	public static void main(String[] args) {
		String file = "test/testdatei.txt";

		try {
			einlesen(file);
		} catch (Exception e) {
			System.out.println("Es gibt Probleme beim Einlesen!");
		}
	}

	public static void einlesen(String file) throws Exception {
		BufferedReader br = new BufferedReader(new FileReader(file));
		Scanner in=new Scanner(br);
	while(in.hasNext()){
			int i=0;
			String out[i]=in.next();
			System.out.println(out[i]);
			i++;
		}
	}
}
 
Hi!
Zunächst mal erscheint dein Code unvollständig, wo ist denn die Deklaration von out? Das scheint ein Array zu sein, aber damit dürftest du Probleme kriegen, weil du ja im Vorraus nicht weißt, wie viele Zeilen du einlesen wirst...

Definiere dir eine Liste
Java:
List<String> out
, und füge in deiner Schleife die gelesene Zeile hinzu
Java:
out.add(in.next();
.

Hilft dir das weiter?

Geb bitte beim nächsten mal genauer an, woran es hakt (Fehlermeldung?!), das macht die Sache einfacher!

Gruß,

RoCMe
 
Code:
String out[i]=in.next();

Ich glaube damit möchte er sagen, was out ist, auch wenn die Zeile so nicht funktionieren kann ^^ Aber für mich ergibt es keinen, wozu es in einer Liste oder ähnlichem gespeichert werden sollte. Zudem sieht die Schleife merkwürdig aus, da i IN der Schleife deklariert wird, d.h. i ist beim Durchgang immer wieder 0 und wird dann sinnloser weise um 1 hochgesetzt.
Was genau soll dir out bringen? Ich vermute, dass du einfach die eingelesenen Zeilen ausgeben und diese dabei zählen möchtest, falls nicht, so kannst du im nachfolgenden Code i rauspacken. Also versuche es mal so:

Java:
int i=0;
while(in.hasNext()) {
System.out.println(in.next());
i++;
}

Du könntest alternativ auch eine for-Schleife basteln ;)

Falls du wirklich die Zeilen speichern magst, obwohl ich tatsächlich nicht verstehe, aus welchen Grund man dies tun sollte, dann versuche es mal so, wie es bereits RoCMe vorgeschlagen hat. Allerdings kannst du hier dann den Index i weglassen, dass die Zeilenanzahl durch die Anzahl der Elemente in der Liste bereits mit verfügbar ist.

Edit: Btw in.next() zählt nur für ein Token, sicher, dass du nicht in.nextLine() und in.hasNextLine() nutzen möchtest?
 
Zuletzt bearbeitet:
eigentlich kannst du dir das mit dem char-array sparen.

der reader müsste (grade kein eclipse hier) eine methode readline(); zur verfügung stellen, die gibt dir einen String mit einer Zeile des Textes zurueck. Ein weiterer Aufruf gibt dir dann die naechste zeile. Das ganze solange laufen lassen, wie reader.ready(); (oder reader.isready();, bin mir grade nicht sicher)

also:

Java:
String temp;
while(reader.ready()){
temp = reader.readLine();
system.out.println(temp);
}

dafür brauchst du übrigens nur die definition: BufferedReader reader= new BufferedReader(new FileReader(file));
Den Scanner kannst du dann weglassen.

P.S.: Ich habe übrigens statt dem FileReader einen FileInputStream genutzt. Musst du mal austesten ob beides klappt.
 
eigentlich kannst du dir das mit dem char-array sparen.

der reader müsste (grade kein eclipse hier) eine methode readline(); zur verfügung stellen, die gibt dir einen String mit einer Zeile des Textes zurueck. Ein weiterer Aufruf gibt dir dann die naechste zeile. Das ganze solange laufen lassen, wie reader.ready(); (oder reader.isready();, bin mir grade nicht sicher)

also:

Java:
String temp;
while(reader.ready()){
temp = reader.readLine();
system.out.println(temp);
}

dafür brauchst du übrigens nur die definition: BufferedReader reader= new BufferedReader(new FileReader(file));
Den Scanner kannst du dann weglassen.

P.S.: Ich habe übrigens statt dem FileReader einen FileInputStream genutzt. Musst du mal austesten ob beides klappt.

Da muss man dazu sagen, dass wir nur davon ausgehen, dass er zeilenweise einlesen möchte und nicht etwa "wortweise" oder ganz und gar zeichenweise :D
 
Zuletzt bearbeitet:
achso, ja war ein bisschen schlecht erklärt:D!
also nochmal:
Code:
	while(in.hasNext()){
			int i=0;
			String out[i]=in.next();
			System.out.println(out[i]);
			i++;
		}
	}

ich hatte vergessen zu erwähnen, dass ich int i=0, das [i] und i++ erst im nachhinein hinzugefügt. Vorher hat es also funktioniert, dass er den kompletten Text aus der Datei gelesen und ausgegeben hat.
Nun wollte ich jedoch reinbauen, dass er den ersten Token einliest und in out[0] speichert, den 2. Token in out[1] speichert und so weiter......!
Ich denke jetzt ist meine Absicht ein bisschen deutlicher beschrieben;)...
 
So, wie dein Code momentan aussieht, kann das sicherlich nich funktionieren, das i wird wie oben schon bemerkt bei jedem Durchlauf 0 sein...

Wie oben schon vorgeschlagen: Nimm statt dem Array eine Liste, und schreib deine Werte da rein. Vermutlich willst du später per Indizes wieder auf die Tokens zugreifen, deswegen bietet sich eine ArrayList<String> an.
Woran scheiterst du denn nun genau?
 
OK danke für die Anworten, das mit der ArrayList habe ich gebraucht...!
Der richtige Code, den ich benötigte ist folgender:
Code:
package lernen;

import java.io.*;
import java.util.*;

public class TxtEinlesen {
	public static void main(String[] args) {
		String file = "test/testdatei.txt";

		try {
			einlesen(file);
		} catch (Exception e) {
			System.out.println("Es gibt Probleme beim Einlesen!");
		}

	}

	public static void einlesen(String file) throws Exception {
		BufferedReader br = new BufferedReader(new FileReader(file));
		Scanner in = new Scanner(br);
		ArrayList<String> out = new ArrayList<String>();
		while (in.hasNext()) {
			out.add(in.next());
		}
		for (int i = 1; i <= out.size(); i++) {
				System.out.println("Wort" +i+ ": " + out.get(i-1));
		}
	}
	
}
 
Zurück