2017-01-23 5 views
1

Как написать строку, содержащую новые строки ("\ n") в файл, чтобы каждая строка находилась в новой строке в файле?Написание строк в файлах

У меня есть функция аккумулятора, которая выполняет итерацию по некоторым данным и инкрементно строит строку (содержащую информацию) для каждого элемента данных. Я не хочу писать в файл каждый шаг, поэтому я добавляю строки на каждом шаге. Я делаю это, поэтому я могу написать строку за один раз и ограничить количество ввода-вывода.

Добавление новой строки в строку через str ++ "\n" не работает, hPrint h str просто напечатает "\n" вместо того, чтобы начинать новую строку.

Я попытался скопировать список строк, вместо одной большой строки, и итерации по списку и печати каждой строки через hPrint. Это работает для новых строк, но также печатает кавычки вокруг каждой строки в каждой строке.

ответ

7

Не использовать hPrint писать строки в файл. Так же, как и обычный print, он выводит результат show, который создает дружественную для отладки версию строки с управляющими символами и концами строк, которые экранированы (и окружающие цитаты).

Используйте вместо этого hPutStr или hPutStrLn. Они будут записывать строку в файл as-is (ну, последнее добавляет новую строку в конец).

+0

Теперь я перебираю список строк и записываю их в файл с помощью 'hPutStrLn'. Я думаю, это то, что вы имели в виду. В любом случае, он работает. – Valerie94

1

Возможно, идиоматическое решение того, что вы пытаетесь сделать, - просто заполнить полученные строки в списке. Затем используйте функцию прелюдии unlines, которая имеет подпись 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 
+0

Проблема не в строках, это то, как они записываются в файл. Использование 'hPrint' на' unlines ["foo", "bar"] 'не даст лучших результатов, чем' hPrint "foo \ nbar". – sepp2k

+0

Это не решает мою проблему. Это все еще записывает кавычки в файл. – Valerie94