2015-11-19 83 views
1

如何將Float數組寫入二進制文件然後讀取它?將浮點數組寫入二進制文件並在swift中讀取

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

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

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

你會之前的設計,你自己的二進制協議檢查http://www.catb.org/esr/writings/taoup /html/ch05s01.html – user3441734

+0

它必須是二進制的,還是可以是plist? – Knight0fDragon

+0

嗯,我建議你把它寫入plist(數組爲NSArray).writeToFile(yourPath,atomically:false) –

回答

3

請試試這個...

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 
} 
+0

非常感謝你!它完美的工作! – vkalit

1

正如你在評論所說,速度是當務之急。然後,我建議您使用Cocoa提供的Data類將您的數組寫入二進制文件。

代碼:

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

// 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 
相關問題