将Float数组写入二进制文件并在Swift中读取

5

我该如何将Float数组写入二进制文件并读取它?

var array: [Float]: [0.1, 0.2, 0.3]

func writeArrayToBinary(array: [Float]) {
    //...
}

func readArrayFromBinary() -> [Float] {
    //...
}

1
在你设计自己的二进制协议之前,请查看http://www.catb.org/esr/writings/taoup/html/ch05s01.html。 - user3441734
它必须是二进制的吗,还是可以是一个属性列表(plist)? - Knight0fDragon
我建议您将其写入一个属性列表(数组作为NSArray)。writeToFile(yourPath,atomically:false) - Dennis Weidmann
@Knight0fDragon,我的优先考虑是I/O速度。plist适合这个需求吗?我理解的对吗? - vkalit
@Neo 嗯.. 我可以像写它一样简单地阅读它吗? - vkalit
1
当然可以...等一下,我会告诉你如何做... - Dennis Weidmann
2个回答

16

根据您在评论中提到的要求,速度是最重要的。因此,我建议您使用Cocoa提供的Data类,将数组写入二进制文件(如最初请求的那样)。

let url = URL(fileURLWithPath: "myTestFile.myBinExt")

// Writing
var wArray: [Float] = [1.1, 3.7, 2.5, 6.4, 7.8]
let wData = Data(bytes: &wArray, count: wArray.count * MemoryLayout<Float>.stride)
try! wData.write(to: url)

// Reading file
let rData = try! Data(contentsOf: url)

// Converting data, version 1
var rArray: [Float]?

rData.withUnsafeBytes { (bytes: UnsafePointer<Float>) in
    rArray = Array(UnsafeBufferPointer(start: bytes, count: rData.count / MemoryLayout<Float>.size))
}

print(rArray!)

// Converting data, version 2
let tPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: rData.count)
rData.copyBytes(to: tPointer, count: rData.count)

defer {
    tPointer.deinitialize(count: rData.count)
    tPointer.deallocate(capacity: rData.count)
}

var pointer = UnsafeRawPointer(tPointer) // Performs no allocation or copying; no deallocation shall be done.

// MemoryLayout<Float>.size = 4
print(pointer.load(fromByteOffset: 00, as: Float.self))
print(pointer.load(fromByteOffset: 04, as: Float.self))
print(pointer.load(fromByteOffset: 08, as: Float.self))
print(pointer.load(fromByteOffset: 12, as: Float.self))
print(pointer.load(fromByteOffset: 16, as: Float.self))

输出:

[1.10000002, 3.70000005, 2.5, 6.4000001, 7.80000019]
1.1
3.7
2.5
6.4
7.8

5

请尝试以下方法...

var array: [Float] = [0.1, 0.2, 0.3]

func writeArrayToPlist(array: [Float]) {
    if let arrayPath: String = createArrayPath() {
        (array as NSArray).writeToFile(arrayPath, atomically: false)
    }
}

func readArrayFromPlist() -> [Float]? {
    if let arrayPath: String = createArrayPath() {
        if let arrayFromFile: [Float] = NSArray(contentsOfFile: arrayPath) as? [Float] {
            return arrayFromFile
        }
    }
    return nil
}

func createArrayPath () -> String? {
    if let docsPath: String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last {
        return ((docsPath as NSString).stringByAppendingPathComponent("myArrayFileName") as NSString).stringByAppendingPathExtension("plist")
    }
    return nil
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接