你的代码有什么问题:
你的代码有很多问题。
- 为什么要读两遍。
- 为什么最后有一个 getLine 。
- 您使用的大多数功能的类型都不匹配。
- 输入文件是只包含一行还是多行。
最好查看您正在使用的函数类型,然后组合它们。
根据我可以推断出您想要的内容,您的代码可能会更正
import System.IO
main :: IO ()
main = do
y<-getLine
content <- readFile "input.txt"
let out = sum $ map read $ y:(words content)
putStrLn $ "\nThe amount of money that you want to deposit : " ++ show out
writeFile "input.txt" $ show out
直接回答:
最好withFile
按你想读然后写的方式使用。readFile
懒惰地读取文件,因此无法保证何时关闭文件句柄。在上述情况下,如果您writeFile
在打印输出之前编写该行,则可能会出现运行时错误,抱怨打开的句柄。所以withFile
是一个更安全的选择,与上述情况相比,您将只打开一次文件。
我考虑过您只想将输入文件的第一行中的数字与您输入的数字相加。
import System.IO
main = do
input <- getLine
out <- sumFile (read input) "input.txt"
putStr $ "\nThe amount of money that you want to deposit : " ++ show out
sumFile :: Int -> FilePath -> IO Int
sumFile input fp = withFile fp ReadWriteMode add
where
add handle = do
number <- hGetLine handle
hSeek handle AbsoluteSeek 0
let sum = input + read number
hPutStrLn handle (show sum)
return sum