Kommandos aus Datei lesen

Status
Nicht offen für weitere Antworten.

julchen81

Bekanntes Mitglied
Hallo,

ich musste ein Programm erstellen, das ein Benutzer über die Konsole steuert. In der Aufgabenstellung heißt es:
Zum Testen sollten Sie die einzulesenden kommandos in eine Datei schreiben und ihr Programm so aufrufen, dass es seine Kommandos aus dieser Datei liest. (Dann müssen Sie die Kommandos nicht immer von Hand eingeben.) Dies geht mit "java programm < Dateiname".

mein Programm besteht jetzt aus zwei Klassen: Mealy.java und Main.java.
Die Kommandos hab ich in Testen.txt folgendermaßen gespeichert:
new ab abAB 8
add 1 3 a a
add 1 7 b b
add 2 4 a a
add 2 5 b B
add 3 1 a A
add 3 8 b b
...

Jede Zeile dabei soll einen einzelnen Befehl darstellen.

Wenn ich nun "java Main < Testen.txt" aufrufe, dann erhalte ich eine NullPointerException, die ich nicht erhalte, wenn ich genau dieselben Befehle nicht aus der Datei auslese, sondern einzeln in die Konsole tippe.

Was hab ich bitte falsch gemacht? :bahnhof:

LG
Julia
 
Du meinst, einiges umschreiben um dann mit Hilfe einer while-Schleife zeilenweise aus der Datei zu lesen, bis das Dateiende erreicht ist?

Würde mich wundern, denn an sich sollte das ein Einstiegsprogramm sein, und das finde ich dann doch relativ kompliziert für Neulinge...

Julia
 
ich meine, dass man deine Frage nicht beantworten kann,
ohne den Code dieser Klasse zu sehen 😉

wenn ich das korrekt erinnere, dann hat das übrigens nichts mit Datei-einlesen zu tun,
der Inhalt von Testen.txt wird in System.in eingefügt,
kann im Programm so ausgelesen werden wie eine Tastatureingabe
 
ähm, ja, was machst du denn jetzt mit der datei da? Hast du den standardeingabestrom auf die datei umgebogen oder wie?
 
@ Andrey:
was genau ich mit meiner Eingabe bewirkt habe, weiß ich nicht. Hab lediglich versucht, den Anweisungen zu folgen.

@ SlaterB:
Hier mal Code, hab's aber abgekürzt (hoffentlich nix Entscheidendes gestrichen!! ;-) )
Code:
import java.io.*;
import java.util.StringTokenizer;

public class Main {
	
	public static void main (String[] args) throws IOException {

		String eingabe = "";
		String token;
		char ord;		
		
		while(true) {
			System.out.print ("simulator> ");
			BufferedReader in = new BufferedReader (new InputStreamReader (System.in));
			eingabe = in.readLine();
			StringTokenizer str = new StringTokenizer(eingabe);
			token = str.nextToken();
			ord = token.charAt(0);
		
			switch (ord) {
			case ('n'):
  
         ..........

			case ('q'):
				System.exit(0);
			default:
				System.out.println("Error! Kein bekanntes Kommando eingegeben!");
				break;
			}
		}
	}
}
 
ähm... ich kann schonmal sagen, dass du den BufferedReader keine 1746149157027506 mal zu erzeugen brauchst, einer reicht auch schon.

Aber wo ist denn bitte überhaupt die datei mit den befehlen geblieben, ich seh die hier gar nich? :bahnhof:
 
BufferedReader neu in jedem Schleifendurchlauf ist schonmal schlecht,
durch die Datei sind alle Dateien in System.in sofort da,
der BufferedReader liest in der ersten Schleife alle Zeilen, eine davon verarbeitest du und den Rest wirfst du weg,
denn in der nächsten Schleife wird ein neues Reader erstellt, der nix mehr bekommt

also
BufferedReader in = new BufferedReader (new InputStreamReader (System.in));
vor die Schleife

(Vermutung)

-----

@Andrey

der Inhalt der Datei kommt durch das < in System.in an
 
@julchen81: herzlichen glückwunsch, und übrigens: von den string tokenizern brauchst du auch keine milliarde...

@SlaterB & julchen81:
könntet ihr mir vielleicht erzählen, was dieses "<" bedeutet und wo das überhaupt hinkommt? ???:L ich habs bisher immer explizit im code auf die textdatei umgebogen, etwa so:

Code:
import java.io.*;

public class StreamsUmbiegen {
	
public static void main(String[] args){
	try{
		System.setIn(new FileInputStream("Testen.txt"));
	}catch(FileNotFoundException e){
		System.out.println(e);
	}
	
	BufferedReader r=new BufferedReader(new InputStreamReader(System.in));
	
	String str="";
	while(true){
		try{
			str=r.readLine();
		}catch(IOException e){
			System.out.println(e);
			break;
		}

		if(str!=null){
			System.out.println(str);
		}else{
			System.out.println("---END OF FILE---");
			break;
		}
	}
}

}

ist das überhaupt in ordnung, oder hab ich wieder was verpasst? die version scheint zumindest zu funktionieren... :bahnhof:
 
ich wiederhole nochmal: der Inhalt der Datei kommt durch das < in System.in an

was gibts da sonst zu sagen?

> übrigens: von den string tokenizern brauchst du auch keine milliarde...

nana, pro Zeile neuanzufangen ist schon schlau,
und dann muss es auch ein neues StringTokenizer sein
 
SlaterB hat gesagt.:
nana, pro Zeile neuanzufangen ist schon schlau,
und dann muss es auch ein neues StringTokenizer sein
ja, wo du recht hast hast du recht, man hat schon einen riesenvorteil, wenn man augen im kopf hat^^ 😳 :bae:
 
@ Andrey:
"< Dateiname" benutze ich auch zum ersten Mal, deshalb kann ich mich da nur hinter SlaterB stellen :wink:

Julia
 
aaah! ist das irgendein argument, den man beim start des programms über die konsole übergeben kann oda was?
kP, habs nie gesehen, nie gehört nie benutzt... 😳
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben