2015-10-13 19 views
10

Cách tốt nhất để viết và đọc tệp nhị phân trong Nim là gì? Tôi muốn viết xen kẽ float và ints vào một tập tin nhị phân và sau đó có thể đọc các tập tin. Để viết tập tin nhị phân này bằng Python tôi sẽ làm một cái gì đó giống nhưviết/đọc tệp nhị phân trong 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) 

Để đọc tôi sẽ làm một cái gì đó giống như

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) 

Trong ví dụ này, sau khi đọc các tập tin, arr sẽ

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

Tìm kiếm chức năng tương tự trong Nim.

Trả lời

10

Tôi nghĩ bạn nên tìm mọi thứ bạn cần trong mô-đun streams. Dưới đây là một ví dụ nhỏ:

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

Điều này hoạt động tốt. – COM

Các vấn đề liên quan