2017-11-11 118 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',並忘記了我已經設置了禁用它。 –

相關問題