2

我有一个几百字节的字符串和一些 Int32 值。我想将这些逐字逐句写入文件。

我尝试了许多建议的解决方案,但没有一个对我有用。我在文件中得到多余的括号、空格或逗号。

任何人都可以提出一个简单、可靠的解决方案吗?

我以为我的问题很清楚,但是在阅读了评论后,我将其简化了。

如何将“12345”写入和/或附加到文件中,以使文件包含以下十六进制值:3132333435?

通过编写 NSData 字符串,我可以获得的最佳结果是 <3132333435>。

我可以使用这个链接得到想要的结果:Does swift has a protocol for write a bytes stream? ,但我无法将数据附加到我创建的文件中。

4

2 回答 2

5

我建议使用 NSFileHandle。

我是这样测试的。我从一个包含“测试”一词的文件~/Desktop/test.txt开始。然后我运行了这段代码:

    let s = "12345"
    let d = s.dataUsingEncoding(NSASCIIStringEncoding)!
    let path = ("~/Desktop/test.txt" as NSString).stringByExpandingTildeInPath
    if let fh = NSFileHandle(forWritingAtPath: path) {
        fh.seekToEndOfFile()
        fh.writeData(d)
        fh.closeFile()
    }

结果是文件现在包含

testing12345

十六进制转储显示底层字节是:

74 65 73 74 69 6E 67 31 32 33 34 35

我相信这就是你所说的你想要实现的。

另外,还有一条评论:

我能得到的最好结果是<3132333435>

听起来好像问题只是您不知道如何读取控制台输出。和不在文件中<>它们只是数据的控制台表示的一部分。最好使用 BBEdit / TextWrangler 或专用的十六进制转储器来查看文件的实际字节。

于 2016-03-21T05:05:41.430 回答
1

基本上,问题在于将您的数据正确转换为指针以将其转换为NSOutputStream.write. 以下扩展应该可以满足您的需要:

extension NSOutputStream {
    enum WriteErrors : ErrorType {
        case UTF8ConversionFailed
    }

    func write(string:String) throws -> Int {
        guard let data = string.dataUsingEncoding(NSUTF8StringEncoding) else {
            throw WriteErrors.UTF8ConversionFailed
        }

        return write(UnsafePointer(data.bytes), maxLength: data.length)
    }

    func write(var i:Int32) throws -> Int {
        return withUnsafePointer(&i) {
            self.write(UnsafePointer($0), maxLength: sizeof(Int32))
        }
    }
}

请注意,将原始二进制数据写入文件是不明智的,您应该首先标准化字节顺序,但我将其留给读者作为练习。

于 2016-03-21T04:52:49.390 回答