2015-10-13 33 views
10

Nimでバイナリファイルを読み書きする最も良い方法は何ですか?私は、バイナリファイルに浮動小数点数と整数を交互に書き込んで、そのファイルを読み取ることができます。私はこの例では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) 

ような何かをするだろう読み取るには

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) 

ような何かをするだろうPythonで、このバイナリファイルを書き込むには、ファイルを読んだ後、ARRは

[(0.5, 1), (1.5, 2), (2.5, 3)] 
だろう

Nimで同様の機能を探しています。

答えて

10

streamsモジュールで必要なものがすべて見つかるはずです。ここに小さな例があります:

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

これはうまくいきます。 – COM

関連する問題