skip to main content

kiesler.at

eprog.jar
updated by rck, 2006-03-27

Die Eprog.jar ist eine Funktionsbibliothek, die Informatik-Studenten auf der TU Wien Einführung in die Programmierung erleichtern soll. Tatsache ist, dass es hier möglicherweise das eine oder andere Problem gibt. Dieser Artikel beleuchtet den "rückgewonnenen" Quellcode.

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8

readWord

Readword ist meiner Meinung nach die mit Abstand interessanteste Eprog-IO Funktion. Wärend man sich die Fixkommadarstellung zur Not selber basteln kann (auch das ist nicht gerade eine Fingerübung), tut man sich bei readWord als Einsteiger vermutlich ein bisserl schwerer.

Deshalb hoffe ich auch, dass wir gemeinsam durch diesen Sourcecode endlich den Grund für die diversen "Programmhänger" feststellen und entkräften können.

145         public static String readWord() {
146                 StringBuffer stringbuffer;
147                 boolean flag;
148                 stringbuffer = new StringBuffer();
149                 flag = false;
150                 char c;
151 
152                 try {
153 
154                         while((c = (char)is.read()) != -1) {
155 
156                                 if(!Character.isWhitespace(c)) {
157                                         flag = true;
158                                         stringbuffer.append(c);
159                                         continue; /* Loop/switch isn't completed */
160                                 }
161                                 if(flag)
162                                         return stringbuffer.toString();
163 
164                         }
165 
166                 }
167                 catch(IOException ioexception) {
168                         ioexception;
169                         ioexception.printStackTrace();
170                 }
171 
172                 return stringbuffer.toString();
173         }
174 

Beschreibung

Anmerkung: 153 - 163 waren Labels und Gotos; ich hoffe, sie richtig "übersetzt" zu haben. Gegen Ende des Artikels findet sich das "Original". Bitte Korrekturen im Kommentarbereich vermerken!

153 Treibende Kraft hinter readWord ist readChar, welches uns Zeichen für Zeichen liefert. Tatsache ist, dass es manchmal -- zumindest bei den EPROG-Übungen -- eben genau das nicht mehr tut.

is ist übrigens unser InputStreamReader aus dem Hauptprogramm:

254         static InputStreamReader is;
255 
256         static  {
257                 is = new InputStreamReader(System.in);
258         }
259 }

Aus der read-Dokumentation:

Returns: The character read, or -1 if the end of the stream has been reached

Die Schleife wird somit bis "End of Stream" durchlaufen. In der Theorie.

156-160 Sollte das eingelesene Zeichen kein Leerzeichen, Tabulator oder ähnliches sein, siehe auch isWhiteSpace Dokumentation, haben wir ein "abspeichernswertes" Zeichen gefunden. Unser flag wird dadurch 1, wir haben also in Summe schon mindestens ein Zeichen eingelesen. Mit stringbuffer.append(c) hängen wir das Zeichen an unserem Zwischenergebnis an und gehen in der Schleife weiter (mit continue). Die nächsten Anweisungen werden somit nicht ausgeführt!

161-162 bekamen wir von unserem InputStreamReader hingegen ein Whitespace, stellt sich die Frage: Ist im stringbuffer schon etwas sinnvolles drinnen? Ja: Wir sind fertig. Nein: Wir lesen weiter.

Zusammenfassung readWord

Wieso sich das Ding aufhängt, ist mir nicht klar. Möglicherweise liefert read bei EOF kein -1? Müsste man ausprobieren.

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8



RSSComments - Make a comment
The comments are owned by the poster. We are not responsible for its content.
  • EOF

    Posted on 2004-06-10 01:58:11 By Anonymous

    Hab readWord jetzt mal zu einem alleinstehenden Programm abgeändert und ein paar Ausgaben reingetan. Und siehe da: bei EOF liefert println (c) ein Fragezeichen. Natürlich steht in c nicht wirklich ein Fragezeichen, das wird nur von println so gemacht. EOF ist nämlich in unicode nicht definiert!!! Ein einfaches Character.isDefined (c) löst das Problem!

    [Reply ]

    • Re: EOF

      Posted on 2004-06-10 17:20:47 By rck[110]

      changed On 2004-06-10 17:21:41 Edited By rck (reason: )

      Du meinst also, da gehört ein Check auf "?" (wobei für ? das EOF-Zeichen einzusetzen ist) und nicht auf -1?

      [Reply ]

RSSAll Articles
2008, 2007, 2006, 2005, 2004