当我使用init(contentsOfFile :)创建一个字符串时,为什么会有额外的新行字符?
问题描述:
我试图读取我的包中文件的内容并将其放入一个字符串变量中。我使用了init(contentsOfFile:)
初始值设定项。但是,在字符串的末尾似乎总是有一个额外的\n
字符。当我使用init(contentsOfFile :)创建一个字符串时,为什么会有额外的新行字符?
这里是一个MCVE:
let string = try! String(contentsOfFile: Bundle.main.path(forResource: "test", ofType: "txt")!)
print(string.debugDescription)
test.txt
是这样的:
Hello
World
Bye
World
请注意,我并没有在结尾处一个新行。这可以通过查看线数可以证明:
上面的代码产生这样的输出:
"Hello\nWorld\nBye\nWorld\n"
注意的最后一个字符是一个\n
。
这对我造成了很多麻烦。我使用\n
作为分隔符来分割字符串,然后解析每一行。最后的\n
会导致空字符串位于拆分字符串中。我不想那样。
我想我可以叫dropLast
删除最后一个字符,但我不知道是否有新行字符将总是也会出现在最后当我这样做,因为我无法找到任何文件。如果碰巧一个额外的新行字符未添加到最后,则我的dropLast
调用将错误地删除“有用”字符。
为什么要添加新行?这是否总是发生?
答
这是Xcode的行为。 为了测试这一点,你可以查看通过在文件上右键单击换行符的文件选择
打开为 - >六角
如果这种行为是不希望你可以在终端中使用vim
和禁用增加:
最后的'\ n'字符是否来自'print'本身?尝试在最后添加一个新的行字符,并查看打印是否在最后生成两个'\ n'。也可以尝试'let hasEol = string.last!==“\ n”'看看你回来了什么。 – dasblinkenlight
@dasblinkenlight我在文件末尾添加了一个新行,但打印输出仍然是'“Hello \ nWorld \ nBye \ nWorld \ n”'。这看起来像只在文件中没有新行时才会添加新行......'string.last!==“\ n”'为true。 – Sweeper
最后必须有一个额外的'\ n'。右键单击>打开为>十六进制查看十六进制表示。我想这是在编辑器中保存文件时Xcode的一个*坏*行为。使用外部编辑器打开文件并删除换行符。 – vadian