After `readFile`, why cannot i `writeFile` ?

hitSSQ :: String -> [Int] -> IO () hitSSQ no hitNum = do let newNum = unwords $ [no] ++ map (\n -> show n) hitNum hitNums <- fmap lines $ readFile "test.txt" writeFile "test.txt" $ unlines $ hitNums ++ [newNum] *** Exception: test.txt: openFile: resource busy (file is locked) Sincerely! ----- e^(π⋅i) + 1 = 0 -- View this message in context: http://old.nabble.com/After-%60readFile%60%2C-why-cannot-i-%60writeFile%60--... Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.

zaxis
hitSSQ :: String -> [Int] -> IO () hitSSQ no hitNum = do let newNum = unwords $ [no] ++ map (\n -> show n) hitNum hitNums <- fmap lines $ readFile "test.txt" writeFile "test.txt" $ unlines $ hitNums ++ [newNum]
*** Exception: test.txt: openFile: resource busy (file is locked)
You're currently reading the file; finish reading it and close it before you write over it (or else use WriteRead mode or whatever it's called and call openFile explicitly rather than using readFile and writeFile). -- Ivan Lazar Miljenovic Ivan.Miljenovic@gmail.com IvanMiljenovic.wordpress.com

readFile reads the file lazily so it isn't closed until the entire contents have been consumed.
Try System.IO.Strict.readFile, which will read the entire file at once.
zaxis
hitSSQ :: String -> [Int] -> IO () hitSSQ no hitNum = do let newNum = unwords $ [no] ++ map (\n -> show n) hitNum hitNums <- fmap lines $ readFile "test.txt" writeFile "test.txt" $ unlines $ hitNums ++ [newNum]
*** Exception: test.txt: openFile: resource busy (file is locked)

Bill Atkins-6 wrote:
readFile reads the file lazily so it isn't closed until the entire contents have been consumed.
Try System.IO.Strict.readFile, which will read the entire file at once. Yes, and i can use appendFile too.
appendFile "ssqHitNum.txt" $ unwords $ [no] ++ map (\n -> show n) hitNum ++ ["\n"]
zaxis
writes: hitSSQ :: String -> [Int] -> IO () hitSSQ no hitNum = do let newNum = unwords $ [no] ++ map (\n -> show n) hitNum hitNums <- fmap lines $ readFile "test.txt" writeFile "test.txt" $ unlines $ hitNums ++ [newNum]
*** Exception: test.txt: openFile: resource busy (file is locked)
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
----- e^(π⋅i) + 1 = 0 -- View this message in context: http://old.nabble.com/After-%60readFile%60%2C-why-cannot-i-%60writeFile%60--... Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.
participants (3)
-
Bill Atkins
-
Ivan Lazar Miljenovic
-
zaxis