gpt4 book ai didi

file - 在 Haskell 中写入文件的开头

转载 作者:行者123 更新时间:2023-12-04 03:20:25 25 4
gpt4 key购买 nike

我试图在文件的开头添加一个数字,但函数“appendFile”在文件的末尾添加。

我写了这个,但它没有用。

myAppendFile file = do x <- readFile file
writeFile file "1"
appendFile file x
return x

当我做:
*main> myAppendFile "File.txt"

错误是
the ressource is busy (file is locked)

那么我怎样才能在文件的开头写一些东西呢?

最佳答案

正如 Gabriel 指出的那样,问题在于 readFile按需读取文件内容,并且仅在文件内容被完全使用时才关闭底层文件句柄。

解决方案是要求完整的文件内容,以便处理程序在执行 writeFile 之前关闭.

简短回答:使用 readFile从严格的包装。

import qualified System.IO.Strict as SIO
import Data.Functor

myAppendFile :: FilePath -> IO String
myAppendFile file = do
x <- SIO.readFile file
writeFile file "1"
appendFile file x
return x

main :: IO ()
main = void $ myAppendFile "data"

实现此目的的另一个简单“技巧”是使用 seq :
myAppendFile :: FilePath -> IO String
myAppendFile file = do
x <- readFile file
length x `seq` writeFile file "1"
appendFile file x
return x
seq a b基本上只是 b再加上 b要求, a (在这种情况下为 length x)被评估为 WHNF细查前 b , 这是因为 length需要遍历它的参数(在这种情况下为 x)直到空列表 []可以看到,所以需要完整的文件内容。

请记住,通过使用严格 IO,您的程序将在内存中保存所有文件内容(作为 Char 的列表)。对于玩具程序来说很好,
但是如果你关心性能,你可以看看 bytestringtext取决于你的程序是处理字节还是文本(如果你想处理 unicode 文本)。它们都比 String 高效得多。 .

关于file - 在 Haskell 中写入文件的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30221792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com