如何将包含换行符(" \ n")的字符串写入文件,以便每个字符串都在文件的新行中?
我有一个累加器函数,它迭代某些数据并逐步构造数据的每个元素的字符串(包含信息)。我不想每一步都写入文件,所以我在每一步都附加了字符串。我这样做,所以我可以一次写字符串并限制IO的数量。
通过str ++ "\n"
向字符串添加换行不起作用,hPrint h str
只会打印"\n"
而不是从新行开始。
我尝试累积一个字符串列表,而不是一个大字符串,然后遍历列表并通过hPrint
打印每个字符串。这适用于换行符,但它也会在每行上的每个字符串周围打印引号。
答案 0 :(得分:7)
不要使用hPrint
将字符串写入文件。就像常规print
一样,它会输出show
的结果,它会生成一个调试友好版本的字符串,其中包含控制字符和行结尾转义(以及周围的引号)。
改为使用hPutStr
或hPutStrLn
。他们会按原样将字符串写入文件(嗯,后者在最后添加换行符)。
答案 1 :(得分:1)
您尝试做的可能是惯用的解决方案是简单地在列表中聚合生成的字符串。然后,使用具有签名unlines
的{{1}}前奏函数,并为您执行unlines :: [String] -> String
业务。
然后,可以在\n
的帮助下将字符串写入磁盘,该writeFile
具有签名:writeFile :: FilePath -> String -> IO ()
。
Haskell很懒。因此,有时有助于将Haskell列表视为枚举器(C#如IEnumerable)。这意味着,尝试按行计算,然后手动构建字符串并逐行写入并不是必需的。就像readFile
懒惰地工作一样, lines
。换句话说,如果你试图“优化”看起来像这样的真实形式的代码,你什么也得不到:
main = do
input <- readFile "infile"
writeFile "outfile" ((unlines . process) (lines input))
where
process inputLines = -- whatever you do