2017-01-23 164 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