我正在尝试读取文件的内容,将文本转换为大写,然后将其写回。
这是我写的代码:
import System.IO
import Data.Char
main = do
handle <- openFile "file.txt" ReadWriteMode
contents <- hGetContents handle
hClose handle
writeFile "file.txt" (map toUpper contents)
return ()
但是,这不会向文件写入任何内容,事实上,它甚至会清除它。
我做了一些改变:
main = do
handle <- openFile "file.txt" ReadWriteMode
contents <- hGetContents handle
writeFile "file.txt" (map toUpper contents)
hClose handle
return ()
但是,我收到错误
resource busy (file is locked)
.我怎样才能让这个工作和为什么在这两种情况下都不起作用?
最佳答案
Lazy IO 不好,这通常被认为是 Haskell 中的一个痛点。基本上是 contents
在您将其写回磁盘之前不会对其进行评估,此时由于文件已关闭,因此无法对其进行评估。您可以通过多种方式解决此问题,无需借助额外的库,您可以使用 readFile
函数,然后在写回之前检查长度:
import Control.Monad (when)
main = do
contents <- readFile "file.txt"
let newContents = map toUpper contents
when (length newContents > 0) $
writeFile "file.txt" newContents
我会说这段代码实际上更好,因为你不会写回一个已经为空的文件,这是一个毫无意义的操作。
另一种方法是使用流媒体库,
pipes
是一个受欢迎的选择,有一些很好的教程和坚实的数学基础,这也是我的选择。
关于file - 在 Haskell 中读取和写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31342012/