Loading...
 

Crystal IO


Über die Klasse IO lässt sich auf Dateien, Speicher und Sockets zugreifen.

IO Memory anlegen

# Neues IO-Objekt anlegen
io = IO::Memory.new
 
# In das Objekt schreiben
io.print "Servus"
 
# Objekt anzeigen
p! io


# Ausgabe:
io # => #<IO::Memory:0x7fab0906ff00 @encoding=nil, @encoder=nil, @decoder=nil, @buffer=Pointer(UInt8)@0x7fab09072fa0, @bytesize=6, @capacity=64, @pos=6, @closed=false, @resizeable=true, @writeable=true>


Im obigen Beispiel schreiben wir mit print einen String in den Speicherbereich, der beim Anlegen der Klasse reserviert wurde. Nähere Informationen über das Objekt gibt uns der Befehl p! io.

IO Memory auslesen

Aus dem Objekt wir über Zeiger (Pointer) gelesen.

# Neues IO-Objekt anlegen
io = IO::Memory.new
 
# In das Objekt schreiben
io.print "Servus"
 
# mit gets wird über einen Zeiger (Pointer) von diesem Objekt gelesen
# doch bevor wir lesen, sollten wir den Zeiger an die gewünschte Stelle zeigen lassen
io.pos = 0
 
# jetzt hohlen wir die Daten
p! io.gets

# wir können auch auf io.pos verzichten, wenn wir direkt aus String casten
p! io.to_s

# zum Schluss geben wir den Speicher wieder frei
io.close

# Ausgabe:
io.gets # => "Servus"


IO Memory schreiben

# Neues IO-Objekt anlegen
io = IO::Memory.new

# In das Objekt schreiben
io.print "Servus"

# Weiteren String an die aktuelle Position schreiben
# << ist die Kurzform für print
io << "MASCHINFO"

# Wenn wir das Objekt zu String casten wird der Zeiger automatisch auf Anfang gesetzt
p! io.to_s


# Ausgabe:
io.to_s # => "ServusMASCHINFO"


each_char

# Neues IO-Objekt anlegen
io = IO::Memory.new
 
# In das Objekt schreiben
io.print "Servus"
 
# Pointer setzen
io.pos = 0
 
# Mit each_char durch das Objekt wandern
io.each_char do |char|
  p! char
end

# Ausgabe:
char # => 'S'
char # => 'e'
char # => 'r'
char # => 'v'
char # => 'u'
char # => 's'


write_bytes, read_bytes

Bisher haben wir nur mit Strings gearbeitet. Manchmal will man aber auch Zahlen verarbeiten.
Dazu gibt es die Methoden wirte_bytes und read_bytes

# Neues IO-Objekt anlegen
io = IO::Memory.new
 
# Variable anlegen
zahl = 1.4432_f64
 
# Float64 (8 Byte) in IO schreiben
io.write_bytes(zahl, IO::ByteFormat::LittleEndian)
 
# Pointer auf Anfang
io.rewind
 
# Inhalt lesen
ergebnis = io.read_bytes(Float64, IO::ByteFormat::LittleEndian)
  
p! ergebnis


# Ausgabe:
ergebnis # => 1.4432


Zahlen aus Array in Speicher schreiben

Mit folgendem Beispiel schreiben wir ein Array in einen IO. Anschließend lesen wir den IO wieder aus und addieren alle Zahlen.

# Neues IO-Objekt anlegen
io = IO::Memory.new
 
# Array anlegen
arr = [14.1, 10.2, -1.4]
 
# Das Array in den IO schreiben
arr.each do |zahl|
	io.write_bytes(zahl, IO::ByteFormat::LittleEndian)
end
 
# Pointer auf Anfang
io.rewind
 
# Wieviele 8 Byte Werte sind im Objekt?
anzahl_werte = (io.bytesize / 8).to_u8
 
ergebnis = 0_f64
 
# Inhalt lesen und Zahlen addieren
anzahl_werte.times do |zahl|
	ergebnis += io.read_bytes(Float64, IO::ByteFormat::LittleEndian)
end
 
p! ergebnis


# Ausgabe:
ergebnis # => 22.9