2015-10-13 15 views
10

Jaki jest najlepszy sposób pisania i odczytywania plików binarnych w Nim? Chcę napisać naprzemiennie zmienne i ints do pliku binarnego, a następnie móc odczytać plik. Do napisania tego pliku binarnego w Pythonie chciałbym zrobić coś takiegozapis/odczyt pliku binarnego w Nim

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) 

do zapoznania chciałbym zrobić coś takiego

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) 

W tym przykładzie, po przeczytaniu pliku, arr byłoby

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

Szukasz podobnych funkcji w Nim.

Odpowiedz

10

Myślę, że powinieneś znaleźć wszystko, czego potrzebujesz w module streams. Oto mały przykład:

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

To działa ładnie. – COM

Powiązane problemy