Bücher online kostenlos Kostenlos Online Lesen
Die Programmiersprache Ruby (German Edition)

Die Programmiersprache Ruby (German Edition)

Titel: Die Programmiersprache Ruby (German Edition) Kostenlos Bücher Online Lesen
Autoren: David Flanagan , Yukihiro Matsumoto
Vom Netzwerk:
Text
    set_encoding
lässt sich für jede Art von
IO
-Objekt nutzen. Bei Dateien ist es allerdings oft am einfachsten, die Kodierung beim Öffnen der Datei festzulegen. Das erreichen Sie, indem Sie den Namen der Kodierung an den Dateimodus-String anhängen, zum Beispiel:
in = File.open("data.txt", "r:utf-8"); # UTF-8-Text lesen
out = File.open("log", "a:utf-8"); # UTF-8-Text schreiben
in = File.open("data.txt", "r:iso8859-1:utf-8"); # Latin-1 umgewandelt nach UTF-8
    Beachten Sie, dass es normalerweise nicht notwendig ist, zwei Kodierungen für einen Stream anzugeben, der für die Ausgabe verwendet wird. In diesem Fall wird die interne Kodierung durch die
String
-Objekte festgelegt, die in den Stream geschrieben werden.
    Wenn Sie gar keine Kodierung angeben, greift Ruby auf die externe Standardkodierung zurück (siehe „2.4.2 Quellkodierung und externe Standardkodierung“ ), wenn man aus Dateien liest, und auf keine Kodierung (also die ASCII-8BIT/BINARY-Kodierung), wenn man in Dateien schreibt oder Pipes und Sockets zum Lesen und Schreiben nutzt.
    Die externe Standardkodierung wird aus den Locale-Settings des Benutzers abgeleitet und ist häufig eine Multibyte-Kodierung. Um Binärdaten aus einer Datei zu lesen, müssen Sie daher explizit angeben, dass Sie nicht kodierte Bytes wollen – ansonsten erhalten Sie Zeichen in der externen Standardkodierung. Dazu öffnen Sie eine Datei im Modus
"r:binary"
oder übergeben nach dem Öffnen der Datei
Encoding::BINARY
an
set_encoding
:
File.open("data", "r:binary") # Öffnet eine Datei zum Lesen von Binärdaten
    Unter Windows sollten Sie Binärdateien mit dem Modus
"rb:binary"
öffnen oder für den Stream
binmode
festlegen. Damit wird die automatische Konvertierung von Zeilenumbrüchen vermieden, die Windows durchführen würde und die nur auf dieser Plattform notwendig ist.
    Nicht jede Methode, die Streams liest, berücksichtigt die Kodierung eines Streams. Einige Low-Level-Methoden zum Lesen erwarten ein Argument, das die Anzahl der zu lesenden Bytes festlegt. Aus diesem Grund geben diese Methoden unkodierte Strings mit Bytes und keine Text-Strings zurück. Die Methoden, die keine Anzahl der zu lesenden Bytes angeben, nehmen auch Rücksicht auf die Kodierung.
    9.7.3 Lesen aus einem Stream
    Die Klasse
IO
definiert eine Reihe von Methoden zum Lesen aus Streams. Sie funktionieren natürlich nur, wenn der Stream lesbar ist. Sie können aus
STDIN
,
ARGF
und
DATA
lesen, aber nicht aus
STDOUT
oder
STDERR
. Dateien und
StringIO
-Objekte werden standardmäßig zum Lesen geöffnet, solange Sie sie nicht explizit nur zum Schreiben öffnen.
    9.7.3.1 Zeilen lesen
    IO
definiert eine Reihe von Möglichkeiten, Zeilen aus einem Stream zu lesen:
lines = ARGF.readlines # Lies die gesamte Eingabe, gib ein Array mit Zeilen
     # zurück
line = DATA.readline # Eine Zeile aus dem Stream lesen
print l while l = DATA.gets # Lesen, bis gets bei EOF nil zurückgibt
DATA.each {|line| print line } # Iteriere über Zeilen aus dem Stream bis EOF
DATA.each_line # Ein Alias für each
DATA.lines # Ein Enumerator für each_line: Ruby 1.9
    Es folgen ein paar wichtige Anmerkungen zu diesen zeilenlesenden Methoden. Die Methoden
readline
und
gets
unterscheiden sich nur in ihrer Behandlung von EOF (End-of-File: die Bedingung, die eintrifft, wenn aus einem Stream nichts mehr gelesen werden kann).
gets
liefert
nil
zurück, wenn es für einem Stream bei EOF aufgerufen wird.
readline
wirft stattdessen einen
EOFError
. Wenn Sie nicht wissen, wie viele Zeilen zu erwarten sind, nutzen Sie
gets
. Wenn Sie weitere Zeilen erwarten (und es ein Fehler wäre, wenn sie nicht da sind), verwenden Sie
readline
. Sie können mit der Methode
eof?
prüfen, ob ein Stream schon bei EOF ist.
    Des Weiteren setzen
gets
und
readline
implizit die globale Variable
$_
auf die zurückgegebene Textzeile. Eine Reihe globaler Methoden, wie zum Beispiel
print
, nutzen
$_
, wenn ihnen nicht explizit ein Argument übergeben wurde. Daher könnte die
while
-Schleife im obigen Code kürzer wie folgt geschrieben werden:
print while DATA.gets
    Die Nutzung von
$_
ist bei kurzen Skripten nützlich, aber in längeren Programmen ist es besserer Stil, explizit Variablen zu nutzen, um die gelesenen Eingabezeilen abzuspeichern.
    Ein weiterer Punkt: Diese Methoden werden normalerweise für Textstreams (statt Binärstreams) genutzt, und eine »Zeile« ist eine Abfolge von Bytes bis (einschließlich) zum Standardzeilentrennzeichen (auf den meisten Plattformen

Weitere Kostenlose Bücher