2017-11-11 117 views
2

我试图读取我的包中文件的内容并将其放入一个字符串变量中。我使用了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 

请注意,我并没有在结尾处一个新行。这可以通过查看线数可以证明:

enter image description here

上面的代码产生这样的输出:

"Hello\nWorld\nBye\nWorld\n" 

注意的最后一个字符是一个\n

这对我造成了很多麻烦。我使用\n作为分隔符来分割字符串,然后解析每一行。最后的\n会导致空字符串位于拆分字符串中。我不想那样。

我想我可以叫dropLast删除最后一个字符,但我不知道是否有新行字符将总是也会出现在最后当我这样做,因为我无法找到任何文件。如果碰巧一个额外的新行字符未添加到最后,则我的dropLast调用将错误地删除“有用”字符。

为什么要添加新行?这是否总是发生?

+0

最后的'\ n'字符是否来自'print'本身?尝试在最后添加一个新的行字符,并查看打印是否在最后生成两个'\ n'。也可以尝试'let hasEol = string.last!==“\ n”'看看你回来了什么。 – dasblinkenlight

+1

@dasblinkenlight我在文件末尾添加了一个新行,但打印输出仍然是'“Hello \ nWorld \ nBye \ nWorld \ n”'。这看起来像只在文件中没有新行时才会添加新行......'string.last!==“\ n”'为true。 – Sweeper

+0

最后必须有一个额外的'\ n'。右键单击>打开为>十六进制查看十六进制表示。我想这是在编辑器中保存文件时Xcode的一个*坏*行为。使用外部编辑器打开文件并删除换行符。 – vadian

回答

4

这是Xcode的行为。 为了测试这一点,你可以查看通过在文件上右键单击换行符的文件选择

打开为 - >六角

如果这种行为是不希望你可以在终端中使用vim和禁用增加:

VIM Disable Automatic Newline At End Of File

+0

vim将添加换行符,除非将文件类型设置为二进制。 – vacawama

+0

关于vim的信息和抑制上一个换行符https:// stackoverflow。com/q/1050640/1630618 – vacawama

+0

谢谢大家,我在'tmux'中使用'vi',并忘记了我已经设置了禁用它。 –

相关问题