Die Programmiersprache Ruby (German Edition)
wurden
getc
und
readchar
so geändert, dass statt einer
Fixnum
ein String der Länge 1 zurückgegeben wird. Wenn man mit einem Stream mit Multibyte-Kodierung arbeitet, liest diese Methode so viele Bytes ein, wie notwendig sind, um ein ganzes Zeichen zu lesen. Wenn Sie in Ruby 1.9 einen String mit einem Byte pro Aufruf lesen wollen, verwenden Sie die neuen Methoden
getbyte
und
readbyte
.
getbyte
ist wie
getc
und
gets
: Sie gibt
nil
bei EOF zurück. Und
readbyte
ist wie
readchar
und
readline
: Sie wirft
EOFError
.
Programme (wie Parser), die einen Stream Zeichen für Zeichen einlesen, müssen manchmal ein einzelnes Zeichen zurück in den Stream-Puffer schreiben, damit es beim nächsten Leseaufruf wieder gelesen wird. Das erreichen sie über
ungetc
. Diese Methode erwartet in Ruby 1.8 eine
Fixnum
und in Ruby 1.9 einen String mit einem einzelnen Zeichen. Das zurückgestellte Zeichen wird vom nächsten Aufruf von
getc
oder
readchar
wieder gelesen:
f = File.open("data", "r:binary") # Öffne Datendatei im Binärmodus
c = f.getc # Lies das erste Byte als Integer
f.ungetc(c) # Schreibe das Byte zurück
c = f.readchar # Lies es erneut ein
Eine andere Möglichkeit, die Bytes eines Streams zu lesen, ist der Iterator
each_byte
. Diese Methode übergibt jedes Byte eines Streams an den zugeordneten Block:
f.each_byte {|b| ... } # Iterieren über die verbleibenden Bytes
f.bytes # Ein Enumerator für each_byte: Ruby 1.9
Wenn Sie mehr als ein Byte gleichzeitig einlesen wollen, haben Sie die Wahl zwischen fünf Methoden, deren Verhalten sich jeweils etwas unterscheidet:
readbytes(n)
Liest genau
n
Bytes ein und gibt sie als einen String zurück. Wartet notfalls so lange, bis
n
Bytes eingetroffen sind. Wirft einen
EOFError
, wenn EOF auftritt, bevor
n
Bytes zur Verfügung stehen.
readpartial(n, buffer=nil)
Liest zwischen 1 und
n
Bytes und gibt sie als einen neuen Binärstring zurück oder speichert sie – wenn ein
String
-Objekt als zweites Argument übergeben wurde – in diesem String (wobei ein älterer Inhalt überschrieben wird). Wenn eines oder mehrere Bytes eingelesen werden können, gibt es die Methode (bis zu einem Maximum von
n
) sofort zurück. Die Methode wartet nur dann, wenn keine Bytes bereitstehen. Sie wirft einen
EOFError
, wenn der Stream bei EOF steht.
read(n=nil, buffer=nil)
Liest
n
Bytes (oder weniger, wenn EOF erreicht wird) und wartet bei Bedarf, bis die Bytes bereitstehen. Die Bytes werden als Binär-String zurückgegeben. Wenn das zweite Argument ein bestehendes
String
-Objekt ist, werden die Bytes in diesem Objekt gespeichert (und bestehende Inhalte überschrieben) und der String zurückgegeben. Wenn der Stream bei EOF ist und
n
angegeben wurde, wird
nil
zurückgegeben. Wenn man bei EOF ist und
n
fehlt oder
nil
ist, gibt es den leeren String
""
zurück.
Wenn
n
den Wert
nil
hat oder fehlt, liest diese Methode den Rest des Streams ein und gibt ihn als kodierten Zeichen-String zurück statt als unkodierten Byte-String.
read_nonblock(n, buffer=nil)
Liest die Bytes (bis zu einem Maximum von
n
), die gerade zum Lesen zur Verfügung stehen, und gibt sie als String zurück, wobei ein eventuell angegebener String
buffer
genutzt wird. Diese Methode wartet nicht. Wenn keine Daten aus dem Stream gelesen werden können (das kann zum Beispiel bei einem Netzwerk-Socket oder STDIN geschehen), wirft diese Methode einen
SystemCallError
. Wenn sie bei EOF gerufen wird, wirft diese Methode einen
EOFError
.
Diese Methode ist in Ruby 1.9 neu hinzugekommen. (Ruby 1.9 definiert auch noch andere nicht wartende
IO
-Methoden, aber das sind Low-Level-Funktionen, und sie werden hier nicht behandelt.)
sysread(n)
Diese Methode funktioniert wie
readbytes
, arbeitet aber auf niedrigerer Ebene ohne Puffern. Mischen Sie keine Aufrufe von
sysread
mit irgendwelchen anderen zeilen- oder bytebasierten Lesemethoden – sie sind inkompatibel zueinander.
Hier sehen Sie ein paar Beispiele dafür, wie Sie eine Binärdatei lesen können:
f = File.open("data.bin", "rb:binary") # Keine Newline-Umwandlung, keine Kodierung
magic = f.readbytes(4) # Erste vier Bytes legen Dateityp fest
exit unless magic == "INTS" # Magischer Wert ist "INTS" (ASCII)
bytes = f.read # Lies den Rest der Datei ein
# Kodierung ist binary, daher ist dies ein Byte-String
data = bytes.unpack("i*") # Wandle Bytes in ein Integer-Array um
9.7.4 In einen Stream schreiben
Die
IO
-Methoden zum Schreiben in einen Stream sind Spiegelbilder der Stream-Methoden zum Lesen. Die
Weitere Kostenlose Bücher