# Das EOF (Ctrl + Z) abfangen



## ivan_07 (28. Dez 2007)

Hallo allerseits

Ich habe ein dummes Problem: 


```
public static void main(String[] args)
    {
        int c = 0;
        int nummer = 0;

        try
        {
            FileOutputStream fos = new FileOutputStream("C:/Temp/out.txt");

            System.out.println("Bitte den Text eingeben und die Texteingabe mit Ctrl + Z beenden!\n");

            while ((c = System.in.read()) != -1)
            {
                fos.write(c);
            }

            nummer = System.in.read();
            System.out.println("Nummer: " + nummer);

            nummer = System.in.read();
            System.out.println("Nummer: " + nummer);

            nummer = System.in.read();
            System.out.println("Nummer: " + nummer);

            fos.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
```

Wenn ich den Text eingebe, wird jedes Mal *-1 *eingelesen, obwohl ich gar nicht dazu komme, was einzugeben. Die *-1* ist wohl Ctrl+Z (-1 als Ende des Streams). Wie kann ich diesen Wert aus dem Buffer entfernen und die neue Zahleingabe ermöglichen? 

*Hinweis: *
Der Text kann mehrere Zeilen enthalten und das "\n" kann nicht als Markierungszeichen für das Ende der Eingabe eingesetzt werden!

Danke für jeden Tipp.


----------



## SlaterB (28. Dez 2007)

> wird jedes Mal -1 eingelesen, obwohl ich gar nicht dazu komme, was einzugeben

??

wird überhaupt was eingelesen?
wenn ja was?

> Die -1 ist wohl Ctrl+Z (-1 als Ende des Streams).

was heißt hier 'wohl'? kann man doch mit einfachen Test herausfinden,
was läßt dich vermuten, dass Ctrl-Z irgendwas mit einer Zahl, z.B. -1 zu tun hat?
ich hätte jetzt gedacht, dass das in den meisten Konsolen eher ein Meta-Kommando zum Abbruch des Programms ist


----------



## Guest (30. Dez 2007)

Vielen Dank für diene Antwort.



			
				SlaterB hat gesagt.:
			
		

> >
> wird jedes Mal -1 eingelesen, obwohl ich gar nicht dazu komme, was einzugeben
> 
> 
> ...



Ja, das Einlesen funktioniert. Heisst, ich kann einen Text einlesen und dieser wird in die Datei C:/TEmp/out.txt geschrieben. 



			
				SlaterB hat gesagt.:
			
		

> > Die -1 ist wohl Ctrl+Z (-1 als Ende des Streams).
> 
> was heißt hier 'wohl'? kann man doch mit einfachen Test herausfinden,
> was läßt dich vermuten, dass Ctrl-Z irgendwas mit einer Zahl, z.B. -1 zu tun hat?
> ich hätte jetzt gedacht, dass das in den meisten Konsolen eher ein Meta-Kommando zum Abbruch des Programms ist



Man kann es natürlich auch testen (wurde auch im Debug-Modus gemacht). Soviel ich weiss, wird in der Console mit der Tastenkombination *Ctrl + Z* das Ende der Eingabe in eine Datei (Stream-Ende) markiert. Das was du meinst ist vermutlich *Ctrl + C*. 

Nachdem ich den Text eingegeben und das Ende der Eingabe mit *Ctrl + Z* markiert habe, läuft das Programm bis zum Ende durch, ohne dass ich nach den Zahlen wieder gefragt werde. Der Grund ist der, dass ich im Eingabepuffer immer den Wert *-1* habe, der zur Kontrolle auch ausgegeben wird. 

Meine Frage ist: 
Kann ich diesen Wert überhaupt aus dem Puffer entfernen, denn nur in diesem Fall würde die Methode 'read' anhalten und auf die Eingabe warten?

Meine Befürchtung: 
Mit *Ctrl + Z* markieren ich das Ende des Streams. Ich hoffe nicht, dass ich den Stream (System.in) schliesse.

Also, bit etwas ratlos. Wie kann man das mache bzw. was mache ich falsch? 

Vielen Dank.


----------



## SlaterB (30. Dez 2007)

interessant dieses Ctrl Z, 
ja, ich nehme nun auch an, dass der Stream geschlossen ist,
und kann sonst nichts weiter beitragen 

gibts nicht noch mehr dieser Steuerungszeichen, die du verwenden könntest?
sonst muss es eine bestimmter Textbaustein sein


----------



## ivan_07 (30. Dez 2007)

SlaterB hat gesagt.:
			
		

> interessant dieses Ctrl Z,
> ja, ich nehme nun auch an, dass der Stream geschlossen ist,
> und kann sonst nichts weiter beitragen
> 
> ...



Nun, ich wollte es mit ESC auch probieren, das Programm macht aber keinen Wank. Offenbar wird dieses Zeichen aus irgendeinem Grund gar nicht eingelesen (ASCII: 27). Wenn ich es eingebe und ENTER drücke, sehe ich nur Werte 10 und 13 nacheinander (Zeilenumbruch / Zeilenrücklauf). Ich kann es mir allerdings nicht vorstellen, dass ich ein solches Zeichen von der Console nicht eilesen kann. Vermutlich mache ich es falsch. Denn, mit C habe ich es oft getan und sehe keinen Grund, wieso man es mit Java nicht tunn können sollte. 

Habe das Einlesen mit Methoden der Klasse java.util.Scanner - next bzw. nextLine - probiert, bin aber auch nicht weiter gekommen. 



			
				SlaterB hat gesagt.:
			
		

> a, ich nehme nun auch an, dass der Stream geschlossen ist,



Es bleibt aber die Frage: Wieso lese ich drei mal die -1 aus, wenn der Stream geschlossen sein sollte!

Auf jeden Fall - vielen Dank.


----------



## SlaterB (30. Dez 2007)

> Vermutlich mache ich es falsch. Denn, mit C habe ich es oft getan und sehe keinen Grund, wieso man es mit Java nicht tunn können sollte. 

kommt immer darauf an wo du bist,
die normale Windows- oder sonstige Konsole kann kaum unterscheiden, 
welches Programm gerade läuft und liefert allen die gleichen Zeichen,

Esc funktioniert bei mir aber auch nicht, löscht dagegen die aktuelle Zeile in der Windows-Konsole -> Meta-Kommando

> Wieso lese ich drei mal die -1 aus, wenn der Stream geschlossen sein sollte! 

das ist normal bei geschlossenen Stream: es wird nur noch -1 gelesen

---------

interessanterweise wird bei mir übrigens nur in der Eclipse-Konsole bei Strg-Z der Stream geschlossen, Esc hat gar keine Wirkung,

unter der Windows-Konsole bewirkt Strg-Z den Abbruch der Schleife, aber weitere Eingaben sind möglich!,
verrückt, alles eh nur Spielereien mit den vorgegebenen Möglichkeiten,
von sowas würde ich mich nicht abhängig machen


----------



## ivan_07 (30. Dez 2007)

SlaterB hat gesagt.:
			
		

> von sowas würde ich mich nicht abhängig machen



Ich auch nicht, wenn ich die Wähl hätte. Ich muss aber eine Lösung finden, ohne auf GUI-Komponenten und KeyListener zugreifen zu müssen. Denn, ich kann es mir überhaupt nicht vorstellen, dass so was nicht möglich ist.


----------



## bashi (3. Jan 2008)

hallo

hast du eine lösung für dein problem gefunden? falls ja, wäre ich froh, wenn ich diese sehen dürfte, da ich mit gleichem problem kämpfe. 

mfg


----------



## Guest (5. Jan 2008)

Leider habe ich bis heute keine Lösung gefunden, die verhebt. 

Gruss.


----------

