簡體   English   中英

在Haskell中同時讀取和寫入同一文件時出錯

[英]Error reading and writing same file simultaneously in Haskell

我需要就地修改文件。 所以我打算讀取文件內容,處理它們,然后將輸出寫入同一個文件:

main = do
  input <- readFile "file.txt"
  let output = (map toUpper input) 
  -- putStrLn $ show $ length output
  writeFile "file.txt" output

但問題是,只有當我取消注釋第4行時才會按預期工作 - 我只是輸出字符數到控制台。 如果我不取消注釋,我會得到

openFile: resource busy (file is locked)

有沒有辦法強制閱讀該文件?

最簡單的事情可能是嚴格的ByteString IO:

import qualified Data.ByteString.Char8 as B

main = do
  input <- B.readFile "file.txt"
  B.writeFile "file.txt" $ B.map toUpper input

正如您所看到的,它是相同的代碼 - 但是一些函數被ByteString版本替換。

懶惰的IO

您遇到的問題是Haskell的一些IO函數使用“Lazy IO”,它具有令人驚訝的語義。 在幾乎每個程序中,我都會避免懶惰的IO。

現在,人們正在尋找像管道之類的懶惰IO的替代品,懶惰的IO被視為丑陋的黑客,遺憾的是它被困在標准庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM