2017-01-23 125 views
1

如何將包含換行符(「\ n」)的字符串寫入文件以便每個字符串位於文件的新行中?將新行寫入文件

我有一個累加器函數,它遍歷一些數據併爲數據的每個元素遞增構造一個字符串(包含信息)。我不想每一步都寫入文件,所以我在每一步都附加了字符串。我這樣做是爲了讓我可以在一次寫入字符串並限制IO的數量。

通過str ++ "\n"向字符串添加換行符不起作用,hPrint h str將僅打印"\n"而不是在新行上開始。

我試着累積一個字符串列表,而不是一個大字符串,並遍歷列表並通過hPrint打印每個字符串。這適用於換行符,但它也在每一行的每個字符串周圍打印引號。

回答

7

不要使用hPrint寫的字符串的文件。就像普通的print一樣,它輸出show的結果,它產生一個易於使用的調試版本的字符串,其中包含控制字符和行結尾(以及周圍的引號)。

改爲使用hPutStrhPutStrLn。他們會將字符串原樣寫入文件中(好吧,後者在最後添加了換行符)。

+0

我現在迭代我的字符串列表,並使用'hPutStrLn'將每個字符串寫入文件。我想這就是你的想法。無論哪種方式,它的工作。 – Valerie94

1

你試圖做的可能的習慣解決方案是簡單地將結果字符串聚集在列表中。然後,使用具有簽名unlines :: [String] -> Stringunlines前奏功能,併爲您做\n業務。

然後,將字符串寫入磁盤可以在writeFile的幫助下完成,其簽名爲writeFile :: FilePath -> String -> IO()

哈斯克爾很懶。因此,它有時幫助將Haskell列表看作枚舉數(C#就像IEnumerable)。這意味着在這裏,嘗試計算明智的線條,然後手動構建字符串並逐行寫入它並不是必須的。正如readFile懶洋洋地工作,那麼,例如, lines。換句話說,你一無所獲,如果你嘗試「優化」的代碼看起來它真正的形式與此類似:

main = do 
    input <- readFile "infile" 
    writeFile "outfile" ((unlines . process) (lines input)) 
    where 
     process inputLines = -- whatever you do 
+0

問題不在於字符串,而是它們如何寫入文件。在'unlines [「foo」,「bar」]'上使用'hPrint'不會產生比'hPrint'foo \ nbar「'更好的結果。 – sepp2k

+0

這並不能解決我的問題。這仍然將引號寫入文件。 – Valerie94