2015-10-13 10 views
10

Was ist der beste Weg, um eine Binärdatei in Nim zu schreiben und zu lesen? Ich möchte abwechselnd floats und ints in eine Binärdatei schreiben und dann in der Lage sein, die Datei zu lesen. etwas tun, wieschreiben/lesen Binärdatei in Nim

arr = [] 
    with open('/path/to/my/file', 'rb') as fh: 
    data = fh.read() 
    for i in range(0, len(data), 8): 
     tup = binStruct.unpack('fi', data[i: i + 8]) 
     arr.append(tup) 

In diesem Beispiel Um diese Binärdatei zu schreiben in Python ich so etwas wie

import struct 

# list of alternating floats and ints 
arr = [0.5, 1, 1.5, 2, 2.5, 3] 

# here 'f' is for float and 'i' is for int  
binStruct = struct.Struct('fi' * (len(arr)/2)) 
# put it into string format 
packed = binStruct.pack(*tuple(arr)) 

# open file for writing in binary mode 
with open('/path/to/my/file', 'wb') as fh: 
    fh.write(packed) 

zu lesen tun würde, würde ich nach dem Lesen der Datei, würde arr sein

[(0.5, 1), (1.5, 2), (2.5, 3)] 

Auf der Suche nach ähnlichen Funktionen in Nim.

Antwort

10

Ich denke, Sie sollten alles, was Sie brauchen, im streams Modul finden. Hier ein kleines Beispiel:

import streams 

type 
    Alternating = seq[(float, int)] 

proc store(fn: string, data: Alternating) = 
    var s = newFileStream(fn, fmWrite) 
    s.write(data.len) 
    for x in data: 
    s.write(x[0]) 
    s.write(x[1]) 
    s.close() 

proc load(fn: string): Alternating = 
    var s = newFileStream(fn, fmRead) 
    let size = s.readInt64() # actually, let's not use it to demonstrate s.atEnd 
    result = newSeq[(float, int)]() 
    while not s.atEnd: 
    let element = (s.readFloat64.float, s.readInt64.int) 
    result.add(element) 
    s.close() 


let data = @[(1.0, 1), (2.0, 2)] 

store("tmp.dat", data) 
let dataLoaded = load("tmp.dat") 

echo dataLoaded 
+0

Das funktioniert gut. – COM